Files
benilla-octo/docs/CONTRIBUTING.md
T
SamandClaude Fable 5.1 aff5203393 a fresh clone gets the whole project, and the maintainer's tooling moves out
What a clone lacked: the gates went green with a thousand skipped tests and said nothing, every
login script assumed a worktree-pool slot and its probe account, the client defaulted to the
maintainer's account, a docker path and a home directory were in the code, the temp files broke
on GNU coreutils, and two generators could only run against a sibling repo.

Now the test gates print how many data-gated tests skipped and why; a scripted run logs in as
the account its checkout declares in `.probe-identity` or as the three variables name, never a
default, and the client refuses a scripted login on any other account; the event and message
tables regenerate from vendored inputs, byte for byte; the docs state the real prerequisites.

Out of the tree, into the maintainer's own tooling: the worktree pool, its hooks, the perf leg
runner, the cross-platform compile and the Vulkan container leg — a way of working, and setups
not every machine has. One hook stays: no writes into the install.

Two tests that could never run are gone with their subject: the quest-timer geometry diff
compared a copy of the window that no longer exists (and joined a chain path onto a folder, so
it always skipped), and the FrameXML flag gate now reads the stock files off the player's own
patch chain instead of an extracted folder only one machine had.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 17:27:14 +07:00

4.0 KiB

Contributing

benilla is a faithful 1.12.1 client. It is the foundation people build on, not the place to get creative: a change is accepted when it makes benilla more like 1.12.1 or fixes a bug, with evidence from the reference, in one small piece, with the gates green. Everything else is a fork, and forks are welcome.

What gets in

  • A fix for a bug, with how to see it before and after.
  • A step closer to 1.12.1: a missing packet, verb, window, effect or behaviour, done the way the real client does it.
  • A correction where benilla and the reference disagree, with the reference fact stated.

What does not

  • Features 1.12.1 does not have, and behaviour changed because it seems better. A deviation from the reference is the maintainer's call and is recorded where it lives; a pull request is not the place to propose one.
  • Anything from a WoW install: art, models, sounds, maps, data. The one exception is interface code (FrameXML and GlueXML), and only through the migration recipe in docs/METHOD.md.
  • Big or mixed changes. One change per pull request, small enough to read in one sitting.

How a change is judged

  1. scripts/gates.sh is green: fmt, clippy with warnings denied, the workspace tests, the doc-link and render-pass lints, the player build with its own tests, and the engine boot checks.
  2. The reference fact is stated: what 1.12.1 does, and where that is known from (the client's behaviour you observed, a DBC field, a FrameXML line, a packet capture). The names and shapes under reference/ are the surface benilla tracks.
  3. A comment where it matters, one line, saying what the code does and the 1.12 fact behind it. No history.
  4. The commit message says what changed, for a player or a developer, in one line.

Setting up

  • The toolchain. Stable Rust (rust-toolchain.toml adds clippy and rustfmt) and a C compiler, because the client's Lua is vendored and built from source. On macOS the Xcode command line tools, which also supply libclang for the audio bindings; on Linux the ALSA and udev development packages and pkg-config. python3 runs two of the gates, and jq the hooks.
  • A 1.12.1 install of your own. WOW_DATA=<its Data folder>, or a WoW link at the repo root, which only a dev build sees: the player build looks for Data/ or WoW/Data/ beside the binary. benilla reads the install and never writes into it. WOW_DATA= (set, empty) means "no install", which is how the no-install boot is tested on a machine that has one.
  • Without the install, green is hollow. About a thousand tests read the install and skip when it is absent; six more read a corpus of vanilla addons (BENILLA_ADDON_CORPUS=<a folder of addons>, or a wow-addons-vanilla link at the root), third-party content that is not in this repo. scripts/gates.sh and scripts/check.sh print how many tests skipped and why. Where the data is, BENILLA_REQUIRE_DATA=1 turns a skip into a failure, and the gates set it themselves when the install and the corpus both resolve.
  • A server to test against. Any 1.12.1 server; WOW_HOST names it (default localhost:3724). A scripted run has no default account: WOW_USER, WOW_PASS and WOW_CHAR name a test account on your server whose login kicks nobody, all three, either in the environment or in a .probe-identity file at the repo root (one per line, never committed), and scripts/smoke.sh (the live login gate) refuses without them. The probes drive the body with GM commands, so give that account the top GM level.
  • The loop. cargo play builds and runs the play profile. scripts/check.sh verifies a round of work; scripts/gates.sh is the full chain, and it opens a window for the engine boot checks, so it needs a display. Work on a branch.
  • Bugs, questions and ideas go to the Discord linked from the README. Issues are off on purpose, and pull requests are not open yet.

Working with an AI agent is expected. The agent reads AGENTS.md, and the same rules bind it.