|
|
|
|
@@ -1139,16 +1139,37 @@ one paragraph each and all four are invisible until an outage.
|
|
|
|
|
> - **§H names a `detail` member on an envelope and core has never read one** — see the correction
|
|
|
|
|
> below.
|
|
|
|
|
|
|
|
|
|
> **`detail` is not an envelope member.** The Rust wipes row in [§H](#h--rust--oxide-compatibility)
|
|
|
|
|
> says the revert contract must accept `{ ok: true, detail: 'resource no longer exists' }`, and
|
|
|
|
|
> `events/dispatch.js`'s `classify()` reads `ok`, `retry`, `error`, `await`, `holdFor`, `resources`
|
|
|
|
|
> and `participants` — nothing else. A reason under any other name is dropped in silence and the
|
|
|
|
|
> operator sees `"<action id> refused"`. The sentence §H was making is right and its example is
|
|
|
|
|
> wrong: a revert of something that no longer exists is a success, and it is spelled `{ ok: true }`.
|
|
|
|
|
> **`module-uo` took §H at its word twice** — `uo.item.grant` answers
|
|
|
|
|
> `detail: { granted, missed, why }` and `uo.world.save` answers `detail: { started: true }`, and
|
|
|
|
|
> neither reaches a screen or the ledger. The grant one is the one that matters: which recipients did
|
|
|
|
|
> not receive the item is reported nowhere else.
|
|
|
|
|
> **`detail` was not an envelope member, and now it is** (`website#197`). §H's Rust wipes row told a
|
|
|
|
|
> module the revert contract accepts `{ ok: true, detail: 'resource no longer exists' }`;
|
|
|
|
|
> `events/dispatch.js`'s `classify()` read `ok`, `retry`, `error`, `await`, `holdFor`, `resources`
|
|
|
|
|
> and `participants` and had never read a `detail`. **`module-uo` took §H at its word twice** —
|
|
|
|
|
> `uo.item.grant` answers `detail: { granted, missed, why }` and `uo.world.save` answers
|
|
|
|
|
> `detail: { started: true }` — and both were writing into nothing. The grant is the one that
|
|
|
|
|
> mattered: a grant reaches the players a run's participation ledger holds, and *which of them missed
|
|
|
|
|
> out* is knowable only to the module, so an operator saw a step `done` and never learned four of
|
|
|
|
|
> twelve got nothing.
|
|
|
|
|
>
|
|
|
|
|
> **Fixed by making the member real rather than by deleting the reporting**, because §H's sentence
|
|
|
|
|
> was right and only its example was wrong. `detail` is now optional on both SUCCESS shapes,
|
|
|
|
|
> **carried and never interpreted** — nothing in the dispatcher, the runner or the browser reads a
|
|
|
|
|
> key out of it — and the runner writes it as a `step.detail` run-log line. Its own log kind rather
|
|
|
|
|
> than a field on `resource.recorded`, because the grant that forced it ledgers nothing
|
|
|
|
|
> (`reversible: 'none'`) and reports no participants, so it would have had nowhere to ride.
|
|
|
|
|
>
|
|
|
|
|
> Two things about the fix are worth keeping. **Anything wrong with a `detail` is dropped and logged,
|
|
|
|
|
> never a failure** — a step that did what it was asked must not be re-run because its module's
|
|
|
|
|
> commentary was malformed, which is a world write repeated for a log line. And **the console's
|
|
|
|
|
> renderer was half the fix**: `describeLogLine`'s default returns a kind *word*, so a `step.detail`
|
|
|
|
|
> row falling through would have rendered as the literal string `step.detail` — the channel existing
|
|
|
|
|
> and showing nothing, which is the failure it was built to fix. It renders the module's keys
|
|
|
|
|
> generically; a switch on known keys would be the browser learning one module's vocabulary.
|
|
|
|
|
> **`module-uo` needed no change**: the code it already shipped started working. The failure channel
|
|
|
|
|
> is unchanged and is still `error` alone.
|
|
|
|
|
|
|
|
|
|
> **A revert of something gone is spelled `{ ok: true }`**, and §H said `{ ok: true, detail: ... }`
|
|
|
|
|
> until Phase 15. `detail` is a real member now, but it is a *diagnostic line*, not the way a revert
|
|
|
|
|
> reports success — the success is `ok`, and a module that put its answer only in `detail` would be
|
|
|
|
|
> reverting nothing.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
@@ -1223,7 +1244,7 @@ more than one. Nothing here contradicts it.
|
|
|
|
|
| Participation | The hard part | Substantially easier — hooks carry attacker and victim. |
|
|
|
|
|
| **Rewards** | An item into a backpack. `reversible: 'none'` — once given it is gone. | A kit, a permission group, currency via an economics plugin, a cosmetic. **Several of those are revocable**, so a Rust reward may be `reversible: 'override'` — a weekend VIP group is a lease with a deadline, not a gift. Core sees the difference as one enum value it never interprets. |
|
|
|
|
|
| Several servers | One shard | `run.scope` is in the run's unique key, so one definition fans out to six servers without colliding with itself. Caps are per-run, so a fan-out to six servers is six separate budgets rather than one shared pool. |
|
|
|
|
|
| Wipes | Never | Monthly, and a wipe invalidates every ledgered resource for that server at once. The revert contract must accept "gone, and that is fine" as a successful revert, spelled `{ ok: true }` — **not** `{ ok: true, detail: ... }`, which this row said until Phase 15 and which `classify()` has never read (see [§F](#f--the-module-contract)). A wipe also resets leased values to their defaults, a second reason restore must be idempotent. |
|
|
|
|
|
| Wipes | Never | Monthly, and a wipe invalidates every ledgered resource for that server at once. The revert contract must accept "gone, and that is fine" as a successful revert, spelled `{ ok: true }`. This row said `{ ok: true, detail: 'resource no longer exists' }` until Phase 15, when `detail` turned out to be a member nothing read; it is a real one now, but it is a diagnostic line beside the answer and never the answer itself (see [§F](#f--the-module-contract)). A wipe also resets leased values to their defaults, a second reason restore must be idempotent. |
|
|
|
|
|
| Identity | In-game `[link` code | Steam — still `rust-dryrun` finding 1's open gap. Events neither closes it nor depends on it: `event_run_participants` carries a module-opaque `member_key`. |
|
|
|
|
|
|
|
|
|
|
**The agnosticism is provable, not merely asserted.** Make `event_definitions.owner_module` nullable
|
|
|
|
|
|