docs(rust-link): protocol 2 — the read path, and phase 3 as built #255
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/rust-protocol-2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The specification the other three repositories are held against, plus the phase record.
PROTOCOL.md§8 — the read pathIts centre is one field. Every frame now carries
type—event,snapshot,reply,control— and the sidecar files on that and nothing else. That is the dumb-forwarder property made structural rather than intended: ten new event kinds are zero change in Rust-Link, and only a version adding an indexed column touches it at all.Also in §8:
wipeIdderived by the plugin, which reverses §3.2's "deriving one is the website's job" — by protocol 2 three components store rows that need it and only one can read the value;OnDispenserGatherfires on every swing at a tree);return null;GET /feed, a cursor route deliberately separate from/events, because one route with two orderings serves the wrong one to every caller that forgets the parameter — and for an ingesting caller that means advancing past rows it never read.§8.5 is the part to read twice. Whether a kind is public is not on the wire. A boundary declared by the sender is one a compromised — or merely out-of-date — game host can widen, so the module holds a default-deny allowlist and this table is what its test holds it against. Protocol 2 carries IP addresses, player reports, and the grid reference of somebody's base.
§8.8 corrects a catalogue, not a defect.
PLAN.md§10 sourcesrust.login.deniedfromCanUserLogin— but that hook fires on every attempt, and the only way to learn of a denial from it is to be the denier. A denial is the absence of an approval; protocol 2 emits both facts so phase 10 can pair them.PLAYER_WALK.md— newHalf this catalogue cannot fire without somebody holding a mouse. Ten steps, what each one should produce, and what counts as a pass — written so it can be run without watching the output live, and so the result afterwards reads as a transcript.
PLAN.md§16 — phase 3 as builtThe four org-lead decisions, what was proven and how, and the two defects only a server that BOOTED with the plugin could find:
Initruns before the save is loaded, and every development iteration was a hot reload, which reads an already-loaded world and gets the right answer every time;Unloadblocked the game's main thread for 2002 ms — a blockingTcpClient.Connectagainst a host that drops rather than refuses. Every loopback test is the first kind.It also states plainly what is not proven yet and who it is waiting on (§16.7).
Companion PRs:
Rust-Plugins,Rust-Link,Module-Rust.🤖 Generated with Claude Code
https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
The module half exercised against the live rig rather than only its own tests: the working tree installed into a running core, pointed at the workstation sidecar with a real Rust server behind it. The fresh-install path logged `cursor started at the feed tail`, a console banid/unban arrived as two rust_events rows carrying the wipe id, and the wipe row was created by being mentioned rather than by any "a wipe started" call. Then the boundary on real rows: with both ban events in the table, the public events route answered {"events":[]} — and answered the same when asked for player.banned BY NAME. The trap is worth more than the proof. The state row read as online=1 with hostname=NULL, a shape no code path writes. Two cores shared one database: a second instance still held the phase 2 release in memory, spoke protocol 1, was refused 409, and rewrote the row every thirty seconds. Nothing was wrong with either. What made it look like a defect was two SELECTs in two round trips assuming the state did not move between them — the same mistake the Pterodactyl work recorded, and a single atomic read caught the coherent row alternating with the other writer's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4