feat(doctor): the one host prerequisite the Asset Bridge added (Phase 9a) #25

Merged
whitlocktech merged 1 commits from feat/asset-bridge-p9 into edge 2026-09-14 22:25:55 +00:00
Member

libgdiplus, on Linux hosts only — the installer's share of the Asset Bridge (docs/link/v8.md §15, §17.2; docs#244).

ServUO targets net48, so on Linux it runs under Mono, and Mono's System.Drawing is a thin layer over that library — which sits in the decode path, not merely the encode: Ultima.Frame writes ARGB1555 through a LockBits pointer, so without it the shard cannot read one sprite out of the operator's UO client.

§17.2 took all three answers to this rather than one: the prerequisite in SHARD_PREREQS.md, a named NO_IMAGING status instead of an error, and a doctor check. The first two shipped in phase 1 — and SHARD_PREREQS.md has been claiming the third exists ever since. Now it does.

Three deliberate properties

  • Linux only, and absent elsewhere. A Windows host ships System.Drawing with .NET Framework and has nothing to check, so there is no row rather than a row saying "not applicable" on three quarters of the hosts that run this.
  • A , never a . Names and the shard's own spawn files have no pixels in them, so a host without the library still runs a useful bridge — and doctor's exit code, which monitoring reads, must not go red over one absent feature. The shard still reports NO_IMAGING from inside the process that would do the decoding; this row only moves the discovery from "the bestiary is empty, weeks later" to "the host is missing a package, now".
  • ldconfig -p first, paths second. The loader's own cache is the same question Mono asks at runtime, so a distro that puts the file somewhere unusual answers correctly. The path probe is the fallback for a slim container with no ldconfig, and a missing ldconfig degrades to it rather than taking doctor down — the rule every row in that module follows.
⚠ Imaging (libgdiplus)    not found on this host
    this shard cannot decode artwork out of its UO client — creature portraits and
    item pictures will be absent; names and the spawn atlas are unaffected
    install it: apt-get install libgdiplus  /  dnf install libgdiplus
    see docs/link/SHARD_PREREQS.md — Windows hosts need nothing

Tests

The verdict is split from the detection so the mark and the wording are testable on a host that has the library and one that does not. All three tests are cfg(target_os = "linux")-gated — which is where CI runs, and is the only place the row exists at all.

cargo fmt --check, cargo clippy --all-targets -- -D warnings and cargo test (140 passing) are green locally on Windows, where the row and its tests compile out; the row itself is exercised by CI's ubuntu runner.

AI disclosure

Written with Claude Code (Claude Opus 5); commits carry the Co-Authored-By trailer.

🤖 Generated with Claude Code

https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4

`libgdiplus`, on Linux hosts only — the installer's share of the Asset Bridge (`docs/link/v8.md` §15, §17.2; docs#244). ServUO targets `net48`, so on Linux it runs under Mono, and Mono's `System.Drawing` is a thin layer over that library — which sits in the **decode** path, not merely the encode: `Ultima.Frame` writes ARGB1555 through a `LockBits` pointer, so without it the shard cannot read one sprite out of the operator's UO client. §17.2 took **all three** answers to this rather than one: the prerequisite in `SHARD_PREREQS.md`, a named `NO_IMAGING` status instead of an error, and a `doctor` check. The first two shipped in phase 1 — and `SHARD_PREREQS.md` has been *claiming* the third exists ever since. Now it does. ## Three deliberate properties - **Linux only, and absent elsewhere.** A Windows host ships `System.Drawing` with .NET Framework and has nothing to check, so there is **no row** rather than a row saying "not applicable" on three quarters of the hosts that run this. - **A `⚠`, never a `✗`.** Names and the shard's own spawn files have no pixels in them, so a host without the library still runs a useful bridge — and `doctor`'s exit code, which monitoring reads, must not go red over one absent feature. The shard still reports `NO_IMAGING` from inside the process that would do the decoding; this row only moves the discovery from "the bestiary is empty, weeks later" to "the host is missing a package, now". - **`ldconfig -p` first, paths second.** The loader's own cache is the same question Mono asks at runtime, so a distro that puts the file somewhere unusual answers correctly. The path probe is the fallback for a slim container with no `ldconfig`, and a missing `ldconfig` degrades to it rather than taking `doctor` down — the rule every row in that module follows. ``` ⚠ Imaging (libgdiplus) not found on this host this shard cannot decode artwork out of its UO client — creature portraits and item pictures will be absent; names and the spawn atlas are unaffected install it: apt-get install libgdiplus / dnf install libgdiplus see docs/link/SHARD_PREREQS.md — Windows hosts need nothing ``` ## Tests The verdict is split from the detection so the mark and the wording are testable on a host that has the library and one that does not. All three tests are `cfg(target_os = "linux")`-gated — which is where CI runs, and is the only place the row exists at all. `cargo fmt --check`, `cargo clippy --all-targets -- -D warnings` and `cargo test` (140 passing) are green locally on Windows, where the row and its tests compile out; the row itself is exercised by CI's ubuntu runner. ## AI disclosure Written with Claude Code (Claude Opus 5); commits carry the `Co-Authored-By` trailer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
wtclaude added 1 commit 2026-09-14 18:11:24 +00:00
feat(doctor): the one host prerequisite the Asset Bridge added (Phase 9a)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 1m39s
ead105d5bf
`libgdiplus`, on Linux hosts only. ServUO targets net48, so on Linux it runs
under Mono, and Mono's `System.Drawing` is a thin layer over that library -- which
sits in the DECODE path, not merely the encode: `Ultima.Frame` writes ARGB1555
through a LockBits pointer, so without it the shard cannot read one sprite out of
the operator's UO client.

docs/link/v8.md §17.2 took all three answers to this rather than one -- the
prerequisite in SHARD_PREREQS.md, a named NO_IMAGING status instead of an error,
and a `doctor` check. The first two shipped in phase 1. This is the third, and
SHARD_PREREQS.md has been claiming it existed since then.

Three things about the row are deliberate:

- **Linux only, and absent elsewhere.** A Windows host ships System.Drawing with
  .NET Framework and has nothing to check, so there is no row rather than a row
  saying "not applicable" on three quarters of the hosts that run this.
- **A warning, never a failure.** Names and the shard's own spawn files have no
  pixels in them, so a host without this library still runs a useful bridge, and
  `doctor`'s exit code -- which monitoring reads -- must not go red over one
  absent feature.
- **`ldconfig -p` first, paths second.** The loader's own cache is the same
  question Mono asks at runtime, so a distro that puts the file somewhere unusual
  answers correctly; the path probe is the fallback for a slim container with no
  ldconfig, and a missing ldconfig degrades to it rather than taking doctor down.

The verdict is split from the detection so the mark and the wording are testable
on a host that has the library and one that does not; all three tests are
Linux-gated, which is where CI runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
whitlocktech merged commit 2285fff759 into edge 2026-09-14 22:25:55 +00:00
whitlocktech deleted branch feat/asset-bridge-p9 2026-09-14 22:25:56 +00:00
Sign in to join this conversation.
No description provided.