diff --git a/runicnpc/PLAN.md b/runicnpc/PLAN.md index 9e186ae..5c6ff32 100644 --- a/runicnpc/PLAN.md +++ b/runicnpc/PLAN.md @@ -13,7 +13,8 @@ site 2026-10-05** on both rigs (§9); its API is [API.md](API.md) version 4. **S 2026-10-05** (D273–D282, §0), **its spike measured 2026-10-05** on both rigs, and **its two questions answered the same day** (D283, D284, §9). **Its build's own questions were answered the same day too** (D285–D289), and **stage 6 was built and walked on the site 2026-10-05** on both rigs (§9); its API is [API.md](API.md) version 5. **Stage 7's design answered 2026-10-05** (D290–D299, §0). **Stage 9's design answered 2026-10-06** (D306–D314, §0 and §9). **Phase 9b was built 2026-10-06** (§9), with its two questions answered the same day (D315, -D316). +D316). **v1.0.0 released 2026-10-09** (D330) in the stage 9 cutover, with the bundle 2026.10.09 (protocol 13) +that carries it (§9, 9e step 3). RunicNPC is Runic Gateway's own NPC plugin for Rust servers, in its own repository, [`RunicGateway/runicnpc-rust`](https://gitea.whitlocktech.com/RunicGateway/runicnpc-rust). It runs on Oxide and @@ -152,6 +153,7 @@ architectural or design decision is implemented. | **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. | | **D329** | **The Kits reload the first load asks for is owed until Kits has the example kits.** The reload ran on a one-second timer, and a timer dies with its plugin. In the 9d session RunicNPC was loaded again inside that second on Carbon, the reload was lost, and since `examplesWritten` was already set the examples stayed refused until Kits was reloaded by hand. Now `state.json` holds `kitsReloadOwed`: every load, and Kits coming back, clears it once Kits knows every kit owed, and otherwise asks for the reload again, at most three times, then warns with the command to run. Oxide never showed it, because loading RunicNPC recompiles and reloads Kits there (`// Requires: Kits`). The org lead chose the fix over recording it (2026-10-09). | Record it as a hot-load artifact, with the remedy in INSTALL.md. | +| **D330** | **RunicNPC's stage 9 release is v1.0.0, cut by a `feat!:` commit.** The release engine takes its bump from the non-merge commit subjects since the last tag. Every stage had landed as `feat:`, which would have cut v0.2.0. runicnpc-rust#18 (`feat!:`, with a `BREAKING CHANGE:` footer) changed only the README, and made the cutover cut v1.0.0. The API stays 6 (2026-10-09). | Accept v0.2.0 and change the plan's wording. | **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 @@ -1864,6 +1866,48 @@ since no host outside the test rigs is installed yet, so both verbs apply the ru restored afterwards (their own kits files, `examplesWritten` true) and run the fix's build. The harness gains `s6.examples.reloadSettled` (0.7.3; compiled, not run, while the walk site pushes profiles). +**9e step 3, as built (2026-10-09; D330).** Before anything merged, the org lead answered three questions: how +RunicNPC reaches 1.0.0 (D330), that I open every PR and the org lead merges them in order while I check each release, and +that the staging drill's `PTERODACTYL_DRILL_KEY` is set, since its daily schedule runs from `main` from now on. + +- **The PRs:** runicnpc-rust#18 (the `feat!:` commit, into `edge`), then the five cutovers, `edge` → `main`: + runicnpc-rust#19; Rust-Plugins#29, Rust-Link#23 and installer#40 together; Module-Rust#37. Every PR's checks + were green. They merged between 07:19 and 07:23 UTC. +- **The releases, each checked against its own `SHA256SUMS`:** + + | Repository | Release | What was checked beyond the checksums | + |---|---|---| + | runicnpc-rust | **v1.0.0** | Manifest: `api` 6, Oxide 2.0.7726, Carbon 2.0.259, requires Kits. The shipped `RunicNPC.cs` differs from the merged source only in `[Info(…, "1.0.0")]`. | + | Rust-Plugins | v0.2.0 | Manifest: protocol 13, `runicnpc_api` 6, the bridge and both helpers. | + | Rust-Link | v0.2.0 | Both sidecar binaries, the launcher, and the egg JSON, whose install script carries RunicNPC and the banner. | + | installer | v0.7.0 | `--version` answers 0.7.0. | + | Module-Rust | v0.4.0 | Manifest: `coreApi` ^1.11.0. It speaks protocol 13, and a blank dome stack draws 3. | + +- **The bundle:** `v2/rust/current.json` moved from 2026.09.26.5 (protocol 12, no RunicNPC) to **2026.10.09**: + protocol 13, Rust-Link v0.2.0, Rust-Plugins v0.2.0 and RunicNPC v1.0.0 (`api` 6). Each hash in it equals the one + in its release's `SHA256SUMS`. It composed by itself (run 182, 07:35). Run 179, between the bridge's release and + the sidecar's, was Gate 1 refusing the pair ("Rust-Link v0.1.3 speaks 12, Rust-Plugins v0.2.0 declares 13"). +- **The order was not quite kept.** Module-Rust v0.4.0 was out at 07:24, eleven minutes before the bundle could + install RunicNPC. No server outside the rigs is installed, so nothing met the gap. The checks between merges are + what would have caught it; next time they come before the next merge. +- **`edge` was deleted by every merge** and recreated from the new `main` in all five repositories. +- **The installer's RunicNPC path from a real bundle (the row 9d left for this step):** the released Linux installer + ran in the egg's own installer image (`ghcr.io/ptero-eggs/installers:debian`) against a scratch Oxide root and a + scratch Carbon root, with the state directory relocated and nothing bypassed. On both: + - `install --game rust` resolved 2026.10.09 and placed `RunicNPC.cs` (its manifest's hash, `1.0.0` stamped), + the bridge and both helpers. It wrote the banner: on Oxide where there was no config, on Carbon over the + plugin's defaults. + - `doctor` passed RunicNPC and the bundle. Its two failures were the service and the sidecar, which a relocated + state directory does not register and a scratch root does not run. + - With `RunicNPC.cs` removed, `doctor` failed on it ("RunicNPC is required"), and `update` put it back. +- **The egg, from its released JSON:** the Runic Gateway half of Rust-Link v0.2.0's install script (everything + after steamcmd) ran in the same image on the same two roots. It placed the same files and wrote `rust-link/bundle.json` + with `runicnpc: v1.0.0, api 6`. Its banner and the installer's both equal the 9d walk's banner file as JSON. +- **Not done:** a panel reinstall. The panel's egg 25 was imported on 2026-09-26 and has neither RunicNPC nor the + banner. The panel has no API for writing an egg, so a reinstall that tests the released egg waits for someone to + import Rust-Link v0.2.0's `egg-rust-runicgateway.json` by hand. The rigs still run the 9e step 2 build of RunicNPC, + which equals v1.0.0 apart from its version string. + **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) diff --git a/rust-link/INSTALL.md b/rust-link/INSTALL.md index fc6d7a6..a6d2a0c 100644 --- a/rust-link/INSTALL.md +++ b/rust-link/INSTALL.md @@ -37,9 +37,9 @@ There are three ways to set a server up. They produce the same result: - **The website has the Rust module**, and you are an administrator on it. Servers are added at **Admin → Rust → Servers** (`/admin/rust/servers`). -> **Until module-rust phase 19**, the released Rust module (Module-Rust v0.3.0) speaks protocol 2 -> while the released bridge speaks 12, and a site pairing them answers `409`. This is expected and -> closes with phase 19's release; it is not a fault in your install. +> **The released pieces speak protocol 13 together** (2026-10-09): Module-Rust v0.4.0 on the site, and +> the bundle 2026.10.09 on the server (Rust-Link v0.2.0, Rust-Plugins v0.2.0, RunicNPC v1.0.0). A site +> on Module-Rust v0.3.0 or older speaks protocol 2 and answers `409`: update the module first. ---