docs(link): protocol 6 part b — leases, participation, and what the walk found #220
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/events-p11b-leases-participation"
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#22+link#37+website#193+Module-uo#30. Six files.link/v6.mdgains §§7–10§7 stops saying "what 11b will add" and becomes one version, two halves — with the warning it already carried kept and sharpened: an overlay and a sidecar both declaring
6are only interchangeable within one side of the 11b merge, which is tolerable exactly because nothing is released fromedge.§8, the lease plane. The two mechanisms
EVENTS.mdnames, and three shapes where the obvious alternative is subtly wrong —holdMsoveruntilMsbecause a deadline is measured against two clocks; text on the wire and parsed comparison because a formatted-number diff would report drift on a value nobody touched; refuse-don't-clamp because a clamp leaves the two halves disagreeing about when the world comes back.§9, the participation ledger, including why it is the Bridge's first persisted state and why presence accrues in seconds rather than sample counts.
§10, verification, with the four claims the phase was written to prove and two subsections that are the interesting part.
Three things the repos disproved
Phase 11b is FIVE repos, and the plan was wrong in the opposite direction from 11a. 11a dropped
installerbecause nothing there hardcodes a protocol version. 11b addswebsite, because a lease's ledger row had no reconcile path anywhere:cleanup.jsresolves a resource to the action of the step that made it, and for a lease that action iscore.lease— core's own, on a path a module cannot register anything on.§D's "two patterns" is nearer 95/5. Measured on 57.4: of the 158 non-Bridge
Config.Getcall sites inScripts/, roughly eight are read live. The allowlist is not a curated subset of a large pool; it is nearly the whole of what exists, and the catalog Phase 12 inherits will be short for reasons no care can change. §D now carries the measurement.Config.Sethas exactly one caller in the entire tree (Server/ScriptCompiler.cs). No in-game command, gump or console verb writes a config key, so on a stock shard a GM cannot drift a configuration lease even deliberately. The compare-and-set is still required — Phase 12's object-property leases are trivially driftable — but the config half of it is proved with scaffolding, not by a GM. Recorded in §D beside the first measurement, because it decides howdriftedgets tested at all.Two §G rows close
§10.1 — the defect the phase's own deferral found in 11a's shipped code
bridge.busycame back 200, not 425, the first time anything produced it.BridgeIdempotency.Busybuilt its frame withBegin("bridge.busy")and then appended a diagnostic.Str("kind", prior.Kind)— twokindfields, and every JSON parser takes the last. The sidecar readparticipation.snapshot, matched nothing, and answered a 200 whose body said nothing had happened, which is the worst of the three possible answers because a retry loop reads it as success.Unreachable in 11a by construction, and the sidecar test covering the mapping was correctly feeding it a hand-built frame. This is 11a's own sentence — "11b's leases are the first thing that can actually produce it, and proving it belongs in that walk" — collected, and it is the argument for the phase ordering stated as a fact rather than a hope.
§10.2 / §10.3 — what could not be driven, and two traps
Presence needs a connected client. The sweep credits online players (
NetState != null), which is the correct test and not one a probe should loosen — a character parked in Britain and logged out for eight hours did not attend anything. Kill credit needs none, so accrual, persistence, chunking and replay were all driven; the one unexercised line is named rather than assumed.Core.Killdoes not save the world, so the first restart test reloaded an emptyParticipation.binand looked exactly like a persistence bug.The other five files
INTEGRATION.md— §2 gains v6's event plane; §6 gains "The event plane — leases" and "— participation" with the five and six things a third-party caller actually needs; §7 gains a 403 row, because an operator's refusal is not a malformed request.PLAN.md— a new §7 subsection recording the two ServUO facts that shaped both halves, plus the persistence mechanism and why its hooks attach inConfigure()rather thanInitialize().EVENTS.md— §D's measurement, the two §G rows, and §F'sinForce()beside the three callables with the reason it is notread()plus a comparison.EVENTS_PLAN.md— Phase 11b as built: the five-repo correction, the ten decisions, and every finding above.MODULE_API.md—inForce()in the lease shape, the signature index and the 1.10.0 rule list. Amended in place at 1.10.0, by the same rule §7 states for the protocol.Notes
docshas no CI. Every relative link in the six files was resolved by hand (0 broken). CRLF preserved throughout —git diff --numstatreports 313/91/35/34/60/13 against real content diffs rather than whole-file rewrites, and the tree holds no bare LF and no\r\r\n.Plugin: RunicGateway/servuo-plugins#22 · Sidecar: RunicGateway/link#37 · Core: RunicGateway/website#193 · Module: RunicGateway/Module-uo#30
🤖 Generated with Claude Code