docs(link): protocol 7 part b — what an event borrows, and the one-shots #222

Merged
whitlocktech merged 1 commits from feature/events-p12b-borrowed-and-oneshots into edge 2026-09-07 16:22:31 +00:00
Member

Events Phase 12b, docs half. One of five: website, servuo-plugins, link, Module-uo, docs — all onto edge.

link/v7.md gains §11–§14; EVENTS.md §G's five part-b rows are marked built, three carrying a correction; MODULE_API.md records the three members 12b amends into 1.10.0; EVENTS_PLAN.md has Phase 12b as built.

The design point, written down

A borrowed value whose home is the world save does not come back on a restart the way a config value does. 11b's fail-safe — a lease that never reaches disk makes a restart a free restore — depends entirely on the leased value being memory-only too, and for a spawner property or a seasonal status it is not: a restart preserves the change and destroys only the timer that would have undone it. So those two planes' holds are persisted and their deadlines re-armed, and the config plane's still are not. The same argument, applied where its premise is false.

Five corrections to EVENTS.md

  • Spawner.Amount does not exist. The property is MaxCount; MinDelay/MaxDelay are TimeSpans, so the wire carries seconds.
  • The seasonal toggle is not "small and safe". Safe — ServUO does it to itself from a staff gump — but OnStatusChange() generates or removes world content for six of the eight permitted types.
  • It is a three-value enum over nine named events, not a nine-value enum. (Caught in 12a's survey; the row is corrected now it is built.)
  • TreasuresOfTokuno is excluded, because IsActive() reads its own DropEra rather than Status. A lease on it applies cleanly, reads back, restores cleanly and changes nothing — §N10's "capability that lies", and the one instance no runtime probe can catch.
  • The grant row said failure aborts rather than retries. Protocol 6 changed that: a repeat is answered by the original reply.

The config-lease row is closed at one key: 156 non-Bridge Config.Get sites, 82 outside a field declaration, all but four of those cached at boot anyway. The self-check ships regardless — it exists for the operator whose own scripts read config live.

MODULE_API 1.10.0, amended in place

target on a lease declaration, values on a string lease, searchable + { q } on option sources. Amended rather than bumped for the reason every phase since P10 has: 1.10.0 has never reached main, so no deployment can tell the difference.

The target entry records why this extends core.lease rather than giving the module its own lease verb: §F settled that in Phase 8, and half its objection no longer holds (the two-events-one-target refusal comes from the ledger's unique index whichever verb reserves the row) while the other half — maxDurationMs re-implemented per module — still does.

§14 records the protocol-pin defect 11a and 12a both shipped, and why the test guarding it passed anyway: it asserts the three declarations agree with each other, which all three being equally stale satisfies.

Checks

docs has no CI. Every relative link in the new sections was resolved by hand; the files are CRLF in the working tree and each diff is content-sized (--numstat matches the real change: 281/5, 18/13, 72/0, 79/2), so nothing carries the \r\r\n full-file rewrite.

🤖 Generated with Claude Code

https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4

Events Phase 12b, docs half. One of **five**: `website`, `servuo-plugins`, `link`, `Module-uo`, `docs` — all onto `edge`. `link/v7.md` gains §11–§14; `EVENTS.md` §G's five part-b rows are marked built, three carrying a correction; `MODULE_API.md` records the three members 12b amends into 1.10.0; `EVENTS_PLAN.md` has Phase 12b as built. ## The design point, written down **A borrowed value whose home is the world save does not come back on a restart the way a config value does.** 11b's fail-safe — *a lease that never reaches disk makes a restart a free restore* — depends entirely on the leased value being memory-only too, and for a spawner property or a seasonal status it is not: a restart preserves the **change** and destroys only the timer that would have undone it. So those two planes' holds are persisted and their deadlines re-armed, and the config plane's still are not. The same argument, applied where its premise is false. ## Five corrections to `EVENTS.md` - **`Spawner.Amount` does not exist.** The property is `MaxCount`; `MinDelay`/`MaxDelay` are `TimeSpan`s, so the wire carries seconds. - **The seasonal toggle is not "small and safe".** Safe — ServUO does it to itself from a staff gump — but `OnStatusChange()` generates or removes world content for six of the eight permitted types. - **It is a three-value enum over nine named events**, not a nine-value enum. (Caught in 12a's survey; the row is corrected now it is built.) - **`TreasuresOfTokuno` is excluded**, because `IsActive()` reads its own `DropEra` rather than `Status`. A lease on it applies cleanly, reads back, restores cleanly and changes nothing — §N10's *"capability that lies"*, and the one instance no runtime probe can catch. - **The grant row said failure aborts rather than retries.** Protocol 6 changed that: a repeat is answered by the original reply. The config-lease row is closed at one key: 156 non-Bridge `Config.Get` sites, 82 outside a field declaration, all but four of *those* cached at boot anyway. The self-check ships regardless — it exists for the operator whose **own** scripts read config live. ## MODULE_API 1.10.0, amended in place `target` on a lease declaration, `values` on a string lease, `searchable` + `{ q }` on option sources. Amended rather than bumped for the reason every phase since P10 has: 1.10.0 has never reached `main`, so no deployment can tell the difference. The `target` entry records why this extends `core.lease` rather than giving the module its own lease verb: §F settled that in Phase 8, and half its objection no longer holds (the two-events-one-target refusal comes from the ledger's unique index whichever verb reserves the row) while the other half — `maxDurationMs` re-implemented per module — still does. **§14 records the protocol-pin defect 11a and 12a both shipped**, and why the test guarding it passed anyway: it asserts the three declarations agree *with each other*, which all three being equally stale satisfies. ## Checks `docs` has no CI. Every relative link in the new sections was resolved by hand; the files are CRLF in the working tree and each diff is content-sized (`--numstat` matches the real change: 281/5, 18/13, 72/0, 79/2), so nothing carries the `\r\r\n` full-file rewrite. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
wtclaude added 1 commit 2026-09-07 13:09:42 +00:00
`link/v7.md` gains §11-§14: the two targeted lease planes, the two one-shots, the
routes, and what the build found in already-merged code. `EVENTS.md` §G's five
part-b rows are marked built, three of them carrying a correction. `MODULE_API.md`
records the three contract members 12b amends into 1.10.0. `EVENTS_PLAN.md` has
Phase 12b as built.

THE DESIGN POINT, WRITTEN DOWN

A borrowed value whose home is the world save does not come back on a restart the
way a config value does. 11b's fail-safe -- a lease that never reaches disk makes
a restart a free restore -- depends entirely on the leased value being
memory-only too, and for a spawner property or a seasonal status it is not: a
restart preserves the CHANGE and destroys only the timer that would have undone
it. So those two planes' holds are persisted and their deadlines re-armed, and
the config plane's still are not. The same argument, applied where its premise is
false.

FIVE CORRECTIONS TO EVENTS.md

- `Spawner.Amount` does not exist. The property is `MaxCount`, and
  `MinDelay`/`MaxDelay` are TimeSpans, so the wire carries seconds.
- The seasonal toggle is not "small and safe". Safe, yes -- ServUO does it to
  itself from a staff gump -- but `OnStatusChange()` generates or removes world
  content for six of the eight permitted types.
- It is a THREE-value enum over nine named events, not a nine-value enum.
  (Caught in 12a's survey; the row is corrected here now it is built.)
- `TreasuresOfTokuno` is excluded, because `IsActive()` reads its own `DropEra`
  rather than `Status`. A lease on it applies cleanly, reads back, restores
  cleanly and changes nothing -- §N10's "capability that lies", and the one
  instance no runtime probe can catch.
- The grant row said failure aborts rather than retries. Protocol 6 changed that:
  an idempotency key means a repeat is answered by the original reply, so a
  retried grant cannot be one winner receiving two.

And the config-lease row is closed at one key. Counted on ServUO 57.4: 156
non-Bridge `Config.Get` call sites, 82 outside a field declaration, all but four
of those inside a `Configure()` or static constructor and cached at boot anyway.
The self-check ships regardless -- it exists for the operator whose OWN scripts
read config live.

MODULE_API 1.10.0, AMENDED IN PLACE

`target` on a lease declaration, `values` on a string lease, and `searchable` +
`{ q }` on option sources. Amended rather than bumped for the reason every phase
since P10 has: 1.10.0 has never reached `main`, so no deployment can tell the
difference, and the cutover is what publishes the whole of it.

The `target` entry records why this extends `core.lease` rather than giving the
module a lease verb of its own: §F settled that in Phase 8, and half its
objection no longer holds (the two-events-one-target refusal comes from the
ledger's unique index whichever verb reserves the row) while the other half --
`maxDurationMs` re-implemented per module -- still does.

§14 records the protocol-pin defect 11a and 12a both shipped, and why the test
that guards it passed anyway: it asserts the three declarations agree with each
other, which all three being equally stale satisfies.

CHECKS

`docs` has no CI. Every relative link in the new sections was resolved by hand;
the files are CRLF in the working tree and each diff is content-sized
(`--numstat` matches the real change), so nothing carries the `\r\r\n` full-file
rewrite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
whitlocktech merged commit 697dc80c5f into edge 2026-09-07 16:22:31 +00:00
whitlocktech deleted branch feature/events-p12b-borrowed-and-oneshots 2026-09-07 16:22:31 +00:00
Sign in to join this conversation.
No description provided.