docs(runicnpc): stage 8 built and walked; MODULE_API 1.12.0 progress(), map.live's RunicNPC rows

- website/MODULE_API.md: 1.12.0, an event action's optional
  progress(): its envelope, its two answer shapes, and the rule that it
  answers for one reader and never fails loudly.
- website/EVENTS.md §I: a live occurrence's progress lines.
- rust-link/PROTOCOL.md §17.3: map.live's RunicNPC rows (name, key,
  boss, health, add) and the world layer's boss.
- runicnpc/PLAN.md: stage 8's design renamed live -> progress, and its
  "Built" section, with the branches, the tests and the walk on both
  rigs in the browser and on the emulator.

Also recorded in the plan: a core finding outside this stage. The
public page never shows a live run's phase label, because phaseLabel
looks phases up by id while specs key them by key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-06 08:23:21 -05:00
parent 6a87ce4d23
commit 941e4ae6e5
4 changed files with 112 additions and 11 deletions

View File

@@ -1805,8 +1805,8 @@ drawing a second time. A new map key makes the file stale, and it is ignored.
| Field | Rows |
|---|---|
| `world` | `kind` (`cargo`, `heli`, `chinook`, `bradley`, `supply`, `crate`), `x`, `z`; a locked crate being hacked adds `hackLeftSec`, a hacked one `hacked: true` |
| `events` | what this site's events placed (§15.2): `kind` (`zone`, `crate`, `npc`), `runId`, `x`, `z`, and a zone's `radius` and `name` or a thing's `prefab` |
| `world` | `kind` (`cargo`, `heli`, `chinook`, `bradley`, `supply`, `crate`, `boss`), `x`, `z`; a locked crate being hacked adds `hackLeftSec`, a hacked one `hacked: true`; a `boss` (protocol 13, RunicNPC D302) is one of RunicNPC's bosses placed outside any event, with its `name` |
| `events` | what this site's events placed (§15.2): `kind` (`zone`, `crate`, `npc`), `runId`, `x`, `z`, and a zone's `radius` and `name` or a thing's `prefab` and `key` (the step that placed it). Protocol 13 adds, for one of RunicNPC's NPCs, its `name`, and for a boss `boss: true` and `health` (0–1); and a boss's **adds**, which no step placed, under their boss's run with `add: true` |
| `players` | `steamId`, `name`, `x`, `z`, `sleeping`, `online`. Connected players, then offline sleepers |
| `bases` | `kind` (`tc`, `vending`), `x`, `z`. **Positions only**: no owner, no authorised list, no shop name |
@@ -1822,6 +1822,18 @@ an ask took under 1 ms.
The Steam id comes from `userID`, not `UserIDString`. The phase 14 walk read the latter back empty from
a sleeper made on the server.
**RunicNPC's rows (protocol 13, runicnpc stage 8).** One `RunicNpc_List` per ask is joined to the
ledger by net id:
- **A ledgered NPC** gains its `name` and, for a boss, `boss` and `health`.
- **A RunicNPC NPC owned by a run** (`run:<id>`) that no step ledgered is a boss's add. It joins
`events` with `add: true`.
- **Any other boss** joins `world` as `kind: "boss"`.
- **A placement's ordinary NPCs are not sent** (D302).
`health` is for the event page's progress line. The site's map does not show it (D303) and removes
it before a viewer is sent the layer.
### 17.4 Two bounds, and the console
Two config keys are written into an existing config the first time protocol 11 loads: **`MapMaxSleepers`**