docs(link): protocol 6 as built — a guarantee, and the kind that pays for it #219
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/protocol-v6-idempotency"
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 docs half of
servuo-plugins#21+link#36+Module-uo#29. Five files, one of them new.link/v6.md— the spec of recordEvery protocol version so far added data. This one adds a promise, and says so in its first section:
§2.1 records the four rules that shape the store — reserve on receipt, never release a key that has begun, stamp a replay with the repeat's correlation id, and make the bound loud — each as a decision rather than an implementation detail. §2.1.1 explains the reply-capture filter, which is the non-obvious part: an
admin.auditframe emitted alongside a reply is a fact about the world and must not be replayed, while the reply is an answer to a caller and must be.§3 states plainly what the dumb-forwarder property means here: the sidecar makes no idempotency promise of its own, and the guarantee is the shard's end to end, because that is where the world write happens.
Three plan corrections, all recorded
installeris not in this phase. The plan put it there "because of the pairing", butinstaller/PLAN.md§7.4 made that unnecessary on purpose: no protocol version is hardcoded anywhere in it.bundle.rsreads the number out of the bundle andbundle.yml's Gate 1 reads both halves out of the released artefacts. Version-agnostic — it needed no change for 5 either.edge, the same rule set forMODULE_API_VERSIONon 2026-09-03. v6.md §7 says what 11b will add and, more importantly, warns that an overlay and a sidecar both declaring6are only interchangeable within one side of that merge — tolerable exactly because nothing is released fromedge, and untenable onmain.bossUpalso drops when a GM resets a spawn, when a boss despawns, and after a reconnect clears the sweep's diff cache.The rig trap, written up because the naive check confirms it
v6.md§6.1. A champion killed in the middle of Britain emitted a frame with no region, and three things were true at once: an activeChampionSpawnregisters aChampionSpawnRegionwith a null name and the town region as its parent, so the innermost region containing a champion boss is guaranteed to be nameless;Mobile.Regionhides that by falling back to the map's unnamed default rather than to null; and region registration is deferred, so a lookup at spawn time answers"Britain"while one at the kill does not.The probe printed
region "Britain"on every run, including the ones whose frame carried nothing. A read at spawn time would have confirmed the bug into the design.The other four files
INTEGRATION.md— §2 gains v6; the write plane gains a "Retrying a command safely" section with the four rules a third-party caller needs (a key belongs to your unit of work, not your attempt; one hour; 425 means come back; a replayed reply is an ordinary 200); §7 gains 425 and a paragraph on why it is deliberately not 409; the event catalog gainschamp.boss.killedwith the three absences a consumer will otherwise read as errors.PLAN.md— §5.5 records the observation the new kind rests on: a per-hit damage event needs an override, but a per-kill damage table needs nothing, becauseMobile.DamageEntriesis already there and aCreatureDeathhandler reads it before the creature is disposed of. §7 documents the key on the inbound frames.EVENTS.md— §A row 7 closes, two §G capability rows go to ✅ built, and the failure table's "an action succeeds but the ack is lost" loses its "and it does not exist today".EVENTS_PLAN.md— Phase 11 split, 11a as built with its seven decisions, and both of the phase's rule-shaped findings: a trigger is not a stream (pre-existing in twentymodule-uorules, flagged not fixed), and a new rule needs a new seed group.Notes
docshas no CI. Every relative link and anchor in the five files was resolved by hand.CRLF preserved throughout —
git diff --numstatreports 110/24/331/11/118 against real content diffs rather than whole-file rewrites, and the tree holds no bare LF and no\r\r\n.AI-assisted: Claude Code (Opus 5).
Plugin: RunicGateway/servuo-plugins#21 · Sidecar: RunicGateway/link#36 · Module: RunicGateway/Module-uo#29
🤖 Generated with Claude Code