feat(bridge): server id from the environment, and the first release workflow (phase 18) #13

Merged
whitlocktech merged 1 commits from feat/phase-18-release into edge 2026-09-26 00:34:25 -05:00
Member

Step 3 of the phase-18 build order (docs/modules/rust/PLAN.md §34.2.7), into edge. The cutover of edge into main follows as its own PR, and that merge cuts this repository's first release.

The environment seam (D150, §34.2.4)

  • LoadDefaultConfig runs only when no config file exists. If RUSTLINK_SERVER_ID then holds a valid id, it becomes the file's ServerId.
    • "Valid" is the site's rule, ^[a-z0-9][a-z0-9-]{0,63}$, checked without a Regex.
    • An invalid value is logged with PrintWarning and ignored.
  • The variable is read nowhere else. After that write the file is canonical and the site's lock applies.
  • This is not a message change, so the protocol stays at 12.

The release (D145, §34.2.1)

  • release.yml reuses servuo-plugins' release engine unchanged: tag-only, secrets preflighted, orphan tags recovered and swept, retry on 5xx, and the installer's bundle.yml dispatched at the end.
  • The adapter re-runs checkPlugin.js, then packages runicgateway-rust-plugin-<ver>.tar.gz and SHA256SUMS. The tarball is runicgateway-rust-plugin/{RunicGateway.cs, manifest.json} and names no framework.
  • manifest.json carries protocol, min_oxide_version, min_carbon_version, requires_plugins, the version, the commit and the file's sha256. This is exactly what installer#27's compose job reads.
  • overlay.toml gains min_carbon_version = "2.0.259" (§34.4).

For your review

  • A reading you were not asked about: the release stamps its version into the shipped copy's [Info("Runic Gateway", "RunicGateway", "…")], so oxide.plugins / c.plugins names the release a server runs. The committed file keeps 0.1.0, and the manifest records the commit. The alternative was every release reporting 0.1.0 forever. The gate refuses a file with zero or two [Info] lines.
  • Secrets: my token cannot list Actions secrets, so I could not confirm that REGISTRY_USER/REGISTRY_TOKEN exist on this repository. Please check them before the cutover. If they are missing, the preflight fails before any tag is pushed.

Tested

  • checkPlugin.js: ok (protocol 12, 32 hooks). checkPlugin.test.js: 14 pass, 0 fail.
  • The package step, extracted from the workflow and run in debian:12:
    • the manifest is correct;
    • two builds give byte-identical tarballs;
    • stamping 0.2.3 changes exactly the one [Info] line.
  • The seam itself cannot run outside a Rust server. It is proven in the §34.3 walk, where the egg sets the variable on a fresh server.

Not touched: the README still lists PopupNotifications among the prerequisites, although overlay.toml has called it optional since D141. That is outside this phase, so I'm naming it rather than fixing it.

  • AI-assisted: Claude Code (Claude Opus 5.5)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

Step 3 of the phase-18 build order (docs/modules/rust/PLAN.md §34.2.7), into `edge`. The cutover of `edge` into `main` follows as its own PR, and that merge cuts this repository's first release. **The environment seam (D150, §34.2.4)** - `LoadDefaultConfig` runs only when no config file exists. If `RUSTLINK_SERVER_ID` then holds a valid id, it becomes the file's `ServerId`. - "Valid" is the site's rule, `^[a-z0-9][a-z0-9-]{0,63}$`, checked without a Regex. - An invalid value is logged with `PrintWarning` and ignored. - The variable is read nowhere else. After that write the file is canonical and the site's lock applies. - This is not a message change, so the protocol stays at **12**. **The release (D145, §34.2.1)** - `release.yml` reuses servuo-plugins' release engine unchanged: tag-only, secrets preflighted, orphan tags recovered and swept, retry on 5xx, and the installer's `bundle.yml` dispatched at the end. - The adapter re-runs `checkPlugin.js`, then packages `runicgateway-rust-plugin-<ver>.tar.gz` and `SHA256SUMS`. The tarball is `runicgateway-rust-plugin/{RunicGateway.cs, manifest.json}` and names no framework. - `manifest.json` carries `protocol`, `min_oxide_version`, `min_carbon_version`, `requires_plugins`, the version, the commit and the file's sha256. This is exactly what installer#27's compose job reads. - `overlay.toml` gains `min_carbon_version = "2.0.259"` (§34.4). **For your review** - **A reading you were not asked about:** the release stamps its version into the shipped copy's `[Info("Runic Gateway", "RunicGateway", "…")]`, so `oxide.plugins` / `c.plugins` names the release a server runs. The committed file keeps `0.1.0`, and the manifest records the commit. The alternative was every release reporting `0.1.0` forever. The gate refuses a file with zero or two `[Info]` lines. - **Secrets:** my token cannot list Actions secrets, so I could not confirm that `REGISTRY_USER`/`REGISTRY_TOKEN` exist on this repository. Please check them before the cutover. If they are missing, the preflight fails before any tag is pushed. **Tested** - `checkPlugin.js`: ok (protocol 12, 32 hooks). `checkPlugin.test.js`: 14 pass, 0 fail. - The package step, extracted from the workflow and run in `debian:12`: - the manifest is correct; - two builds give byte-identical tarballs; - stamping `0.2.3` changes exactly the one `[Info]` line. - The seam itself cannot run outside a Rust server. It is proven in the §34.3 walk, where the egg sets the variable on a fresh server. **Not touched:** the README still lists `PopupNotifications` among the prerequisites, although `overlay.toml` has called it optional since D141. That is outside this phase, so I'm naming it rather than fixing it. - [x] AI-assisted: Claude Code (Claude Opus 5.5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-09-25 22:55:02 -05:00
feat(bridge): server id from the environment, and the first release workflow (phase 18)
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in -1m35s
497b7c4f64
Module-rust phase 18, step 3 of docs/modules/rust/PLAN.md §34.2.7.

The environment seam (D150): when the plugin writes its default config and
RUSTLINK_SERVER_ID holds a valid id (the site's ^[a-z0-9][a-z0-9-]{0,63}$),
the file's ServerId is that value. It is read nowhere else: after that write
the file is canonical and the site's lock applies. An invalid value is logged
and ignored. This is how the egg names a server; not a message change, so the
protocol stays at 12.

The release (D145, §34.2.1): release.yml reuses servuo-plugins' release engine
unchanged (tag-only, secrets preflighted, orphan tags recovered and swept, the
installer's bundle.yml dispatched at the end). The adapter re-runs
checkPlugin.js and packages runicgateway-rust-plugin-<version>.tar.gz with a
framework-neutral layout: RunicGateway.cs, its [Info] version stamped to the
release, and a manifest.json folding in overlay.toml.

overlay.toml gains min_carbon_version = "2.0.259", the build R19 was proven on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit a38be86e8d into edge 2026-09-26 00:34:25 -05:00
whitlocktech deleted branch feat/phase-18-release 2026-09-26 00:34:26 -05:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Rust-Plugins#13
No description provided.