docs(runicnpc): 9e step 1 — dome stack 3 and the PopupNotifications banner (D326-D328)

D326: a blank dome stack is 3 (module only; the wire still defaults to 1).
D327: the recommended PopupNotifications banner ships as a paste block
(rust-link/INTEGRATION.md §2.4), from the installer (install and update) and
from the egg's install. D328: "at the plugin's defaults" is all or nothing.
PLAN_REDESIGNS §3's "until it is chosen by eye" closes; rust-link/INSTALL.md
says what the installer and the egg write, and that uninstall leaves it.
Code: Module-Rust#36, installer#39, Rust-Link#22.

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-09 01:25:57 -05:00
parent f4b7b9f3eb
commit 0a826ee366
4 changed files with 81 additions and 4 deletions

View File

@@ -148,6 +148,9 @@ architectural or design decision is implemented.
| **D323** | **Each example profile wears its own outfit; the weapons of D289 stay.** The raider wears scrap armour (coffee-can helmet, roadsign jacket and kilt, hoodie, pants, boots, leather gloves); the camp guard metal (metal facemask and chest plate, long-sleeve shirt, pants, boots, roadsign gloves); the sniper hide (boonie hat, balaclava, hide poncho, pants and boots); the Juggernaut heavy plate, as before. Three shared one hoodie, pants and boots, so they read alike in game. Only a first load writes them (D284): no live server has RunicNPC yet, and the test rigs were given them by resetting `examplesWritten` (9d player walk, 2026-10-09). | One outfit for all; replacing a server's kits that still match the old ones. |
| **D324** | **An example kit's items are written at full durability, read from this Rust's item definitions when the kits are written.** Kits sets an item's condition and maximum straight from its file. The writer put 0 on armour (a metal facemask 0 of 320, heavy plate 0 of 1,000, so it barely protected) and 100 on every weapon whatever its real maximum (an M249's is 500). Now an item with a condition gets the definition's maximum and one without gets 0. The harness checks it (`s6.examples.fullCondition`). | A fixed table of maximums, which a Rust update would make stale. |
| **D325** | **`/rnpc here` stands the NPC 1 m in front of the admin, facing them, not at their feet.** At their feet it spawned inside the admin, looking away (9d player walk). The spot must fit: nothing at chest height in the way, ground no more than 2 m below, and navmesh for one that walks. Otherwise it falls back to the admin's own spot and the reply says so. The harness checks the distance (`cmd.chat.here`). | 1.5 m or 3 m in front; refusing when the spot does not fit. |
| **D326** | **An event zone's dome stacks 3 spheres when its step leaves the stack blank, not 1.** The org lead chose it by eye at noon in the 9d player session. It changes in `module-rust` only, so steps saved with a blank stack draw 3 from their next run. The wire is unchanged: the bridge still gives a `dome` sent without a `stack` 1, and the module always sends one (2026-10-09). | The bridge's default too, which changes a message's meaning and needs a plugin release. |
| **D327** | **A recommended PopupNotifications look ships three ways:** a banner across the top of the screen (left 0.15, bottom 0.87, width 0.7, height 0.07, spacing 0.005), no close button, Roboto Condensed Bold at 18, panel transparency 0.8. It is a block to paste in `rust-link/INTEGRATION.md` §2.4, and both the installer (`install` and `update`) and the Pterodactyl egg's install write it. Each writes it with PopupNotifications' `Version`, because the plugin resets a config without one. PopupNotifications stays optional and is the operator's to install (D141). The org lead: whether `update` also writes it "does not matter", since no host outside the test rigs is installed yet. | Writing it on a first install only; writing it once per host and recording that. |
| **D328** | **"Still at the plugin's defaults" means every setting, all or nothing.** The installer and the egg write the banner only where `PopupNotifications.json` is missing, or where every setting equals PopupNotifications 0.2.1's own defaults (its `Version` aside; numbers compared as numbers). A config with any one setting changed, or one that does not parse, is kept whole and never merged into. | Field by field: our values only where that one field is still at its default, which mixes two looks nobody chose. |
**Borrowing, not copying.** NpcSpawn states no licence at all, so its source grants us nothing and is read only as a
description of *what* can be done in Rust. HumanNPC is MIT on uMod, which is GPL-compatible, but §1.2 rules out its
@@ -1825,6 +1828,23 @@ put three steps in 9e, in this order (2026-10-09), each ending in its PRs:
`module-rust` `edge` → `main` with RunicNPC required. Each release is checked (checksums, the bundle composing)
before the next merge. The row the walk left for it: the installer's RunicNPC path from a real bundle.
**9e step 1, as built (2026-10-09; D326–D328).** Before building, the org lead answered three questions. The dome change
is in the module only. "At defaults" means all settings or none. Whether `update` also writes the banner "does not matter",
since no host outside the test rigs is installed yet, so both verbs apply the rule.
- **Dome stack 3:** Module-Rust#36. A blank stack sends 3, and the field's hint says so. 505/505 tests pass.
- **The banner, three ways:** the paste block in `rust-link/INTEGRATION.md` §2.4; installer#39 (`popup.rs`; a
`popup look` row in the plan; `install` and `update`; 188 tests pass, 5 of them new); Rust-Link#22 (`rg_popup` in
`egg/install.sh`; a failure there is said in the console and does not fail the install). Both write PopupNotifications'
`Version`, because the plugin resets a config without one, and keep a later version they find.
- **How it was checked:**
- **The installer:** run against two scratch roots. No published bundle carries RunicNPC yet, so the run bypassed its
check in the working tree only. Oxide with no config got the banner. Carbon at the rig's defaults got the walk's
banner file exactly. On `update`, a hand-changed config and an existing banner were both kept.
- **The egg's function:** run in `ghcr.io/ptero-eggs/installers:debian` over the same cases, plus a config that is
not JSON and a directory that cannot be made.
- **Left for step 3:** both paths from a real bundle (the installer on a rig, the egg by a panel reinstall).
**Then the Rust plan resumes** at PLAN_REDESIGNS §9 item 6 (the step editor and the kit weekend) and §11.
### Stage 10 — Custom navigation (only if needed)