benilla is one repo: the working tree moves in, restructured

Until now this repo was an export of a private tree, pushed as squashed snapshots. From here on
it is the working tree itself, and the private repo is archived.

The root holds AGENTS.md and the Rust and GitHub files only. Everything an agent needs to orient
is in docs/: METHOD.md (the rules and how the project is built, 123 lines, project method only),
MAP.md (generated from the code at every land) and CONTRIBUTING.md (what gets in and how a
change is judged). One skill, `probe`, holds the procedure for running the client unattended
against the local server.

Brought over because the project needs it: reference/ (the 1.12 name catalogues 34 source
files read; the export failed its own tests without them), the gate chain and the pool
(scripts/), the hooks that enforce the install rule and the worktree rule, the full .gitignore,
the `cargo play` alias, and the original wording of eleven source files the export had reworded.

Left out: the decision records (archived with the private repo), the export tooling, the
operator's Discord and triage loop, the lab-laptop scripts and the instruments nothing
references, which live outside the repo now. What read the records is gone from the tooling:
no corpus lint, no records index, no `reserve` verb, no number-collision check.

Three hooks are gone: fmt-at-commit and the file-size nudge were redundant with the gates, and
the assets/ui guard is now a test (`assets_ui_does_not_grow`) that fails for everyone, not only
for a Claude Code session. The remaining pool hooks stand down on a machine without a pool.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-09-23 15:56:57 +07:00
co-authored by Claude Fable 5.1
parent dd196298b0
commit 3e12fa1d7f
99 changed files with 30532 additions and 81 deletions
+45
View File
@@ -0,0 +1,45 @@
# 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
player build.
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
- A 1.12.1 install of your own: `WOW_DATA=<path>`, or a `WoW` link at the repo root. benilla
reads it and never writes into it.
- A server to test against: any 1.12.1 server. The project runs against a local vmangos
(`WOW_HOST`, `WOW_USER`, `WOW_PASS`).
- `cargo play` builds and runs the play profile. `scripts/check.sh` verifies a round of work;
`scripts/gates.sh` is what a pull request must pass.
- Bugs, questions and ideas go to the Discord linked from the README. Issues are off on purpose.
Working with an AI agent is expected. The agent reads `AGENTS.md`, and the same rules bind it.
+551
View File
@@ -0,0 +1,551 @@
# benilla — generated map
> **GENERATED** by `scripts/genmap.sh` from the code — do not edit by hand; rerun the script
> when what's built changes. *What-is* only: the *what-changed* is in git. No timestamp —
> identical code yields an identical map.
## Crates
- **benilla-adt** (no Bevy) — ADT terrain-tile reader for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-app** (Bevy) — The Bevy app as a library: everything but the build-id stamp, which lives in the `benilla` launcher shim so a commit dirties ~30 lines instead of this crate (decision 0993)
- **benilla-assets** (Bevy) — Bevy AssetSource + AssetLoaders over the WoW 1.12.1 MPQ patch chain
- **benilla-blp** (no Bevy) — BLP2 texture decoder for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-buildstamp** (no Bevy) — The git build-id stamp emitter shared by the launcher shims' build scripts (decision 0993/1160)
- **benilla-bytes** (no Bevy) — Bounds-checked byte readers + IFF chunk iteration shared by the format parsers — decision 0064
- **benilla-dbc** (no Bevy) — WDBC (client DBC) reader for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-formats** (no Bevy) — WoW 1.12.1 asset-format adapters (MPQ/BLP/DBC/ADT/WDT) and the benilla-extract CLI
- **benilla-m2** (no Bevy) — M2 (MD20) model reader for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-mpq** (no Bevy) — Read-only MPQ archive reader for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-protocol** (no Bevy) — WoW 1.12.1 auth (SRP6) + world wire protocol and the benilla-auth CLI
- **benilla-srp** (no Bevy) — WoW 1.12.1 (build 5875) SRP6 client + vanilla world-header crypto — in-repo, decision 0021
- **benilla-ui** (no Bevy) — Engine-free WoW UI engine core: TOC/FrameXML parsing, templates, anchors, z-order — decision 0068
- **benilla-visual** (no Bevy) — Perceptual image diff for the Phase-5 visual A/B render harness (decision 0008)
- **benilla-wdt** (no Bevy) — WDT map tile-table reader + tile/world coords for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-wmo** (no Bevy) — WMO (root + group) reader for WoW 1.12.1 (build 5875) — in-repo, decision 0021
- **benilla-world** (Bevy) — The world renderer: terrain, water, sky, weather, models, lighting, collision and the frame ladder — everything needed to put something in a world and ask the world about itself, with no game attached (decision 1160)
- **benilla-worldview** (no Bevy) — The world viewer: the engine with no game attached — and the wall that keeps the split honest (decision 1160)
- **benilla** (no Bevy) — The launcher: build.rs stamps the git build id, main() hands it to benilla-app. A shim, so the stamp's every-commit rebuild dirties this package and not the app crate (decision 0993)
## App subsystems — Bevy plugins in load order (`crates/benilla-app/src/lib.rs`)
- ThreadQosPlugin
- BgWinPlugin
- MacQuitPlugin
- WorldPlugins
- DevToolsPlugin
- FpsJournalPlugin
- GamePlugins
- DevProbesPlugin
### Behind the `dev` feature (`crates/benilla-app/src/dev.rs` — compiled out by `--no-default-features`)
- DebugPanelPlugin
- PerfPlugin
- HoverLogPlugin
- AssetChurnPlugin
- PreflightPlugin
- ProbeShieldPlugin
- CapturePlugin
- LiveShotPlugin
- ProbeRigPlugin
- ProbeFocusPlugin
- ProbeChatPlugin
- ProbeLuaPlugin
- ProbeDragPlugin
- ProbeHoverPlugin
- ProbeKeyPlugin
- ProbeExitPlugin
- PickProbePlugin
- PhaseProbePlugin
- DepthProbePlugin
- NodeProbePlugin
- ProbeResizePlugin
- ParticleCensusPlugin
- GroundCensusPlugin
- LiftCensusPlugin
- StallPlugin
- TrailCensusPlugin
- UnitVisualsPlugin
- JitterMeterPlugin
- DressCensusPlugin
- RevealAuditPlugin
- EntityCensusPlugin
- SchedCensusPlugin
- ProbeMeleePlugin
- ProbePartnerPlugin
- ProbeCrossingPlugin
- ProbeTaxiPlugin
- ProbeGuardPoiPlugin
- ProbeBgQueuePlugin
- ProbeBgPlugin
- ProbeMailPlugin
- ProbeAuctionPlugin
- ProbeBankPlugin
- ProbeBinderPlugin
- ProbeServicePlugin
- ProbeVendorSwapPlugin
- ProbeModelCameraPlugin
- ProbeGmTicketPlugin
- ProbeCharterPlugin
- ProbeBookPlugin
- ProbeStonePlugin
- ProbeChestPlugin
- ProbeGoQuestPlugin
- ProbeClamPlugin
- ProbeCastCancelPlugin
- ProbeCharCreatePlugin
- LiveFpsPlugin
- ProbeLookPlugin
- ProbePitchPlugin
- ProbeCamPlugin
## Modules (top-level, per crate)
- **benilla-adt** (lib.rs): combined_alpha
- **benilla-app** (lib.rs): addon_harness area area_poi area_trigger asset_churn aura_visual bindings blob_shadow bowstring camera_shake capture char_create char_select chat_bubble chr_classes cinematic combat_log combat_text console crash creature_anim cursor cvars death debug_panel dev doodad_events entities fishing_line footprints game_plugins game_tip glue glue_strings go_anim go_templates hover_log items loading_screen local_state login minimap name_persist nameplates names net npc_text opaque2d pending_item_ops perf pipe_warm player poi_marker portrait preflight probe_shield query_cache quest_markers raid_marks ranged_flex realm_select realmlist run_mode screen_fade screenshot shaders shutdown smart_rect sound spell swing_refusal target test_support text_filter text_reshape textinput transport tutorial ui_action ui_auction ui_aura ui_bank ui_battlefield ui_battlefield_positions ui_battlefield_score ui_bind_confirm ui_binder ui_cast ui_char ui_chat ui_craft ui_dialog_verbs ui_dressup ui_duel ui_follow ui_gamma ui_gm_ticket ui_gossip ui_guild ui_hide ui_honor ui_inspect ui_instance ui_item_text ui_items ui_layout ui_logout ui_loot ui_loot_roll ui_macro ui_mail ui_merchant ui_mirror ui_models ui_net ui_party ui_pass ui_pet ui_pet_book ui_pet_doll ui_pet_stats ui_petition ui_quest ui_quest_log ui_quest_share ui_reputation ui_saved ui_script ui_session ui_shapeshift ui_social ui_spellbook ui_stable ui_summon ui_tabard ui_talent ui_talent_wipe ui_taxi ui_text ui_tooltip ui_trade ui_tradeskill ui_trainer ui_unit ui_world_map video vplates weapon_trail world_backdrop world_state world_state_ui
- **benilla-assets** (lib.rs): adt anim_rng blp column_grid coords gpu_blp m2 materials minimap_grid model spatial_cache terrain tex_filter trace wdt wmo world_assets
- **benilla-formats** (lib.rs): anim_data area_poi area_sound area_table area_trigger auction_house bank_bag_slot_prices camera_shakes chain characters chat_channels chr_classes cinematics creature_families creature_sound creature_types creatures dbc death_thud durability elevators emit_timing emote_text emotes environmental_damage exhaustion factions footsteps game_tips gameobjects garble gm_ticket_category ground_effects install item_random_properties item_sounds item_visuals itembagfamily itemclass items itemsets itemsubclass languages light liquid loading_screen lock lock_type macro_icons maps material minimap_translate models npc_greeting page_text_material particles pet_stats quest_headers quest_info race_pvp_team race_sound ribbons server_messages sheathe skill_lines sound_entries sound_provider sound_water spell_focus spell_mechanic spell_visual spells stable_slot_prices stationery talents taxi taxi_nodes taxi_path terrain text_filter_lists tga transport_period transports unit_blood value_track vocal_ui_sounds wdl weapon_impact weapon_swing wmo_area world_map_area world_map_continent world_map_overlay world_state_ui zone_map
- **benilla-m2** (lib.rs): error model skin tests track
- **benilla-mpq** (lib.rs): crypto
- **benilla-protocol** (lib.rs): auth events guid messages wire world
- **benilla-srp** (lib.rs): vanilla_header
- **benilla-ui** (lib.rs): bindings_xml civil framexml justify layout loader markup messages order script source strings toc widget
- **benilla-visual** (lib.rs): relight
- **benilla-world** (lib.rs): art_scope assets bgwin billboard boot build_id clouds clutter collision decal dev_state doodad_anim entity_shade exterior_cull ffx_glow final_pass frame_pace ground_fx instance_tint interact interior lighting liquid log_ring mac_quit map_proj mat_anim_table mesh_tag model_fade model_forms model_render modkeys particles ribbons ride_frame rig_anim rig_palette rig_rider schedule shaders sky sky_order skybox static_gx static_merge straddle sun surface terrain_stream thread_qos view vis_chain water_fx wdl weather wmo_portal world_census world_map world_plugins world_point world_unit worldview zfill
## CLI binaries
- `benilla-auth` (in benilla-protocol)
- `benilla-extract` (in benilla-formats)
- `benilla-world` (in benilla-protocol)
- `blpx` (in benilla-blp)
- `mpqx` (in benilla-formats)
## WGSL shaders (`crates/*/src/shaders/`, embedded)
- `embedded://benilla_app/shaders/ui_add.wgsl`
- `embedded://benilla_app/shaders/ui_gamma.wgsl`
- `embedded://benilla_app/shaders/ui_node_gamma.wgsl`
- `embedded://benilla_app/shaders/ui_quad.wgsl`
- `embedded://benilla_app/shaders/ui_slice_gamma.wgsl`
- `embedded://benilla_assets/shaders/liquid.wgsl`
- `embedded://benilla_assets/shaders/terrain.wgsl`
- `embedded://benilla_assets/shaders/wdl.wgsl`
- `embedded://benilla_assets/shaders/wow_model.wgsl`
- `embedded://benilla_world/shaders/celestial.wgsl`
- `embedded://benilla_world/shaders/cloud.wgsl`
- `embedded://benilla_world/shaders/ffx_glow.wgsl`
- `embedded://benilla_world/shaders/sky_vertex.wgsl`
- `embedded://benilla_world/shaders/sky.wgsl`
- `embedded://benilla_world/shaders/star.wgsl`
- `embedded://benilla_world/shaders/static_gx.wgsl`
- `embedded://benilla_world/shaders/wow_effect.wgsl`
## Instruments — `$WOW_*` switches (env-var read sites)
> The headless/dev instrument fleet, discovered from the code: every `WOW_*` env var
> some `.rs` reads, and where it's read — the doc comment at the read site is the
> semantics. (The in-window surfaces — the Ctrl+Shift dev-chord overlays — are plugins
> above; this indexes the switches that don't announce themselves.)
- `WOW_ADDON_PROBE_AWAIT_INVITE` — benilla-protocol/examples/addon_chat_probe.rs
- `WOW_ADDON_PROBE_TRACE` — benilla-protocol/examples/addon_chat_probe.rs
- `WOW_ALLOW_ACCOUNT` — benilla-app/src/login/mod.rs, benilla-app/src/run_mode.rs
- `WOW_AMBIGUITY_DUMP` — benilla-app/src/game_plugins.rs
- `WOW_ANIM_COST` — benilla-app/src/creature_anim/driver.rs
- `WOW_ANIM_PARK_ALL` — benilla-app/src/creature_anim/lod.rs
- `WOW_ANISO` — benilla-app/src/cvars.rs, benilla-assets/src/tex_filter.rs
- `WOW_API_DUMP` — benilla-app/tests/world_api_wall.rs
- `WOW_ARCH_CENSUS` — benilla-app/src/perf/mod.rs
- `WOW_ART_RADIUS` — benilla-world/src/art_scope.rs
- `WOW_ASSET_CHURN` — benilla-app/src/asset_churn.rs
- `WOW_ASSET_DUMP` — benilla-app/src/capture/probes/live_fps.rs
- `WOW_AUDIO_LIVE` — benilla-app/src/sound/output/mod.rs
- `WOW_AUDIO_NO_RT` — benilla-app/src/sound/output/mod.rs
- `WOW_AUDIT_` — benilla-world/src/bgwin.rs
- `WOW_AUDIT_START` — benilla-world/src/wmo_portal/audit/mod.rs
- `WOW_AUDIT_WMO` — benilla-world/src/wmo_portal/audit/mod.rs
- `WOW_BARE_DOODAD_COLLIDERS` — benilla-world/src/terrain_stream/collider.rs
- `WOW_BG` — benilla-world/src/bgwin.rs
- `WOW_BLOB_VIS` — benilla-world/src/terrain_stream/merge.rs
- `WOW_BLOB_VIS_UID` — benilla-world/src/terrain_stream/merge.rs
- `WOW_BOOTH_DUMP` — benilla-app/src/portrait/test_bake.rs
- `WOW_BOOTH_LOG` — benilla-app/src/portrait/mod.rs
- `WOW_BUBBLE_TRACE` — benilla-app/src/chat_bubble.rs
- `WOW_CAM_CHANGED` — benilla-app/src/perf/mod.rs
- `WOW_CAM_DUMP` — benilla-app/src/player/camera.rs
- `WOW_CAPTURE` — benilla-app/src/capture/mod.rs, benilla-app/src/capture/scenarios.rs, benilla-app/src/char_select/addons.rs, benilla-app/src/cvars.rs, benilla-app/src/lib.rs, benilla-app/src/local_state.rs, benilla-app/src/login/mod.rs, benilla-app/src/name_persist.rs, benilla-app/src/net.rs, benilla-app/src/player/camera_saved.rs, benilla-app/src/run_mode.rs, benilla-app/src/sound/mod.rs, benilla-app/src/ui_chat/settings.rs, benilla-app/src/ui_chat/tests.rs, benilla-app/src/ui_macro/tests.rs, benilla-app/src/ui_saved.rs, benilla-app/src/ui_script/addons.rs, benilla-app/src/ui_script/mod.rs, benilla-app/src/ui_script/world_entry_tests.rs, benilla-app/src/video.rs, benilla-world/src/bgwin.rs, benilla-world/src/clouds/mod.rs, benilla-world/src/dev_state.rs
- `WOW_CAPTURE_AGE` — benilla-app/src/capture/mod.rs
- `WOW_CAPTURE_DEADLINE` — benilla-app/src/capture/mod.rs
- `WOW_CAPTURE_OUT` — benilla-app/src/capture/mod.rs
- `WOW_CAPTURE_REHOVER` — benilla-app/src/ui_script/mod.rs
- `WOW_CAPTURE_STABLE` — benilla-app/src/capture/mod.rs
- `WOW_CAPTURE_UI` — benilla-app/src/capture/scenarios.rs, benilla-app/src/ui_script/mod.rs, benilla-app/src/video.rs
- `WOW_CAST_TRACE` — benilla-app/src/net.rs
- `WOW_CHAR` — benilla-app/src/capture/probe_mail.rs, benilla-app/src/char_select/mod.rs, benilla-app/src/cvars.rs, benilla-app/src/login/mod.rs, benilla-app/src/net.rs, benilla-app/src/net/io.rs, benilla-app/src/realm_select/smoke.rs, benilla-app/src/run_mode.rs
- `WOW_CHARCREATE_DIALS` — benilla-app/src/char_create/mod.rs
- `WOW_CHARCREATE_NAME` — benilla-app/src/char_create/mod.rs
- `WOW_CHARCREATE_PICK` — benilla-app/src/capture/mod.rs, benilla-app/src/char_create/mod.rs
- `WOW_CHARCREATE_SHOT` — benilla-app/src/char_create/mod.rs, benilla-world/src/bgwin.rs
- `WOW_CHARCREATE_SHOT_OUT` — benilla-app/src/char_create/mod.rs
- `WOW_CHARSELECT_ADDONS` — benilla-app/src/char_select/mod.rs
- `WOW_CHARSELECT_DIALOG` — benilla-app/src/char_select/mod.rs
- `WOW_CHARSELECT_PICK` — benilla-app/src/char_select/mod.rs, benilla-app/src/cvars.rs
- `WOW_CHARSELECT_SHOT` — benilla-world/src/bgwin.rs
- `WOW_CHARSELECT_SHOT_AT` — benilla-app/src/char_select/mod.rs
- `WOW_CHARSELECT_SHOT_OUT` — benilla-app/src/char_select/mod.rs
- `WOW_CHARSELECT_WALK` — benilla-app/src/char_select/mod.rs
- `WOW_CLAMP_COST` — benilla-app/src/net/motion/spline.rs
- `WOW_CLAMP_SEAT` — benilla-app/src/net/motion/spline.rs
- `WOW_CLAMP_TRACE` — benilla-app/src/net/motion/spline.rs
- `WOW_CLOCK` — benilla-world/src/dev_state.rs
- `WOW_CLOUD_DUMP` — benilla-world/src/clouds/mod.rs
- `WOW_CLUSTERS` — benilla-app/src/player/setup.rs
- `WOW_CLUTTER_ALPHA` — benilla-world/src/clutter.rs
- `WOW_CLUTTER_DENSITY` — benilla-app/src/cvars.rs, benilla-app/src/lib.rs, benilla-world/src/clutter.rs
- `WOW_CLUTTER_FADE` — benilla-world/src/clutter.rs
- `WOW_COLUMN_COST` — benilla-assets/src/column_grid.rs
- `WOW_CPU_CENSUS` — benilla-app/src/perf/census.rs
- `WOW_CRASH_INJECT` — benilla-app/src/perf/crash_inject.rs
- `WOW_CREATE_SPLINE` — benilla-app/src/net/motion/spline.rs
- `WOW_CREATE_TEST` — benilla-app/src/portrait/glue_booth.rs, benilla-world/src/bgwin.rs
- `WOW_CULL_TRACE` — benilla-world/src/exterior_cull.rs
- `WOW_CULLDUMP` — benilla-world/src/wmo_portal/mod.rs
- `WOW_CURSOR_TRACE` — benilla-app/src/cursor.rs
- `WOW_DATA` — benilla-app/src/local_state.rs, benilla-formats/src/install.rs, benilla-formats/tests/wow_data_env.rs, benilla-formats/tests/wow_data_none.rs
- `WOW_DEMO_BOTTOM_BARS` — benilla-app/src/ui_script/mod.rs
- `WOW_DEPTH` — benilla-app/src/capture/depth_probe.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_DEPTH_AFTER` — benilla-app/src/capture/depth_probe.rs
- `WOW_DEPTH_AT` — benilla-app/src/capture/depth_probe.rs
- `WOW_DEPTH_COUNT` — benilla-app/src/capture/depth_probe.rs
- `WOW_DEPTH_QUADS` — benilla-app/src/capture/depth_probe.rs, benilla-app/src/dev.rs
- `WOW_DITHER` — benilla-world/src/ffx_glow.rs
- `WOW_DPI` — benilla-app/src/video.rs
- `WOW_DRESS_CENSUS` — benilla-app/src/capture/probes/dress_census.rs, benilla-app/src/dev.rs
- `WOW_DRESS_CENSUS_RADIUS` — benilla-app/src/capture/probes/dress_census.rs
- `WOW_DRIFT_DUMP` — benilla-world/src/liquid/drift.rs
- `WOW_DUMP_TILE` — benilla-world/src/wmo_portal/audit/light_probe.rs
- `WOW_EFFECT_TRACE` — benilla-world/src/particles/render.rs
- `WOW_EMIT_DUMP` — benilla-world/src/particles/emitdump.rs
- `WOW_ENTITY_CENSUS` — benilla-app/src/capture/probes/world_census.rs, benilla-app/src/dev.rs
- `WOW_FADE_NEAR` — benilla-world/src/terrain_stream/spawn/mod.rs
- `WOW_FARCLIP` — benilla-app/src/cvars.rs, benilla-world/src/view.rs
- `WOW_FEED_COST` — benilla-app/src/ui_items/feed.rs
- `WOW_FEED_GATE_CHECK` — benilla-app/src/ui_script/gate.rs, benilla-world/src/bgwin.rs
- `WOW_FEED_GATE_TRACE` — benilla-app/src/ui_script/gate.rs, benilla-world/src/bgwin.rs
- `WOW_FIXED_DT` — benilla-world/src/frame_pace.rs
- `WOW_FOG_DUMP` — benilla-world/src/lighting/resolve.rs, benilla-world/src/liquid/query.rs
- `WOW_FOLLOW_TRACE` — benilla-app/src/player/follow.rs
- `WOW_FORCE_SUB` — benilla-world/src/liquid/mod.rs
- `WOW_FPS_` — benilla-world/src/bgwin.rs
- `WOW_FPS_JOURNAL` — benilla-app/src/perf/journal.rs
- `WOW_FPS_PROBE` — benilla-app/src/capture/mod.rs
- `WOW_FRAME_PHASES` — benilla-app/src/perf/phases.rs
- `WOW_FREEZE_UI_MESH` — benilla-app/src/ui_pass.rs
- `WOW_FX_AGE` — benilla-app/src/capture/mod.rs
- `WOW_FX_AT` — benilla-app/src/capture/mod.rs
- `WOW_FX_AZ` — benilla-app/src/capture/mod.rs
- `WOW_FX_CENSUS` — benilla-app/src/capture/probes/fx_draw_census.rs
- `WOW_FX_DISPLAY` — benilla-app/src/capture/mod.rs
- `WOW_FX_DIST` — benilla-app/src/capture/mod.rs
- `WOW_FX_EL` — benilla-app/src/capture/mod.rs
- `WOW_FX_FLY` — benilla-app/src/capture/mod.rs
- `WOW_FX_GO` — benilla-app/src/capture/mod.rs
- `WOW_FX_GO_STATE` — benilla-app/src/capture/mod.rs
- `WOW_FX_GO_TYPE` — benilla-app/src/capture/mod.rs
- `WOW_FX_GROUND` — benilla-app/src/capture/mod.rs
- `WOW_FX_HOLD` — benilla-app/src/capture/mod.rs
- `WOW_FX_MINUTE` — benilla-app/src/capture/mod.rs
- `WOW_FX_MODEL` — benilla-app/src/capture/mod.rs
- `WOW_FX_SCALE` — benilla-app/src/capture/mod.rs
- `WOW_FX_TURN` — benilla-app/src/capture/mod.rs
- `WOW_FX_UP` — benilla-app/src/capture/mod.rs
- `WOW_FX_YAW` — benilla-app/src/capture/mod.rs
- `WOW_GHOST_PROBE` — benilla-app/src/death/mod.rs
- `WOW_GLUE_ROUNDTRIP` — benilla-app/src/char_select/mod.rs, benilla-world/src/bgwin.rs
- `WOW_GLYPH_CACHE` — benilla-app/src/ui_text/engine/gpu.rs
- `WOW_GM` — benilla-app/src/probe_shield.rs
- `WOW_GOD` — benilla-app/src/preflight.rs, benilla-app/src/probe_shield.rs
- `WOW_GPU_MS` — benilla-app/src/perf/gpu.rs
- `WOW_GPU_PASSES` — benilla-app/src/perf/journal.rs
- `WOW_GROUND_CENSUS` — benilla-app/src/capture/probes/ground_census.rs, benilla-app/src/dev.rs
- `WOW_GROUND_CENSUS_RADIUS` — benilla-app/src/capture/probes/ground_census.rs
- `WOW_GX_CENSUS` — benilla-world/src/static_gx/cull.rs
- `WOW_GX_FADE_TRACE` — benilla-world/src/static_gx/cull.rs
- `WOW_GX_PERF` — benilla-world/src/static_gx/mod.rs
- `WOW_HIT_COST` — benilla-app/src/ui_script/input.rs
- `WOW_HOST` — benilla-app/src/cvars.rs, benilla-app/src/realmlist.rs
- `WOW_HOVER_LOG` — benilla-app/src/hover_log.rs
- `WOW_HOVER_LOG_REPORT` — benilla-app/src/lib.rs
- `WOW_HOVER_PROBE` — benilla-app/src/target/hover_probe.rs
- `WOW_INDIRECT` — benilla-world/src/world_plugins.rs
- `WOW_INTERIOR_COST` — benilla-world/src/interior.rs
- `WOW_INTERIOR_LOG` — benilla-world/src/entity_shade.rs, benilla-world/src/interior.rs, benilla-world/src/model_fade.rs
- `WOW_IO_BUFFER` — benilla-app/src/sound/mixer.rs
- `WOW_JITTER` — benilla-app/src/capture/probes/jitter.rs, benilla-app/src/dev.rs
- `WOW_JITTER_RAW` — benilla-app/src/capture/probes/jitter.rs
- `WOW_LAYOUT_DERIVE_TRACE` — benilla-ui/src/script/model.rs
- `WOW_LAYOUT_PROF` — benilla-ui/src/script/layout.rs
- `WOW_LAYOUT_TOUCH_TRACE` — benilla-ui/src/script/model.rs
- `WOW_LAYOUT_VERIFY` — benilla-ui/src/script/layout.rs
- `WOW_LIFT_CENSUS` — benilla-app/src/capture/probes/lift_census.rs, benilla-app/src/dev.rs
- `WOW_LIGHT_AT` — benilla-world/src/wmo_portal/audit/light_probe.rs
- `WOW_LIGHT_DUMP` — benilla-world/src/lighting/global_light.rs, benilla-world/src/lighting/resolve.rs
- `WOW_LIGHT_GRID` — benilla-world/src/wmo_portal/audit/light_probe.rs
- `WOW_LIQUID_DC` — benilla-assets/src/world_assets/images.rs
- `WOW_LIVE_` — benilla-world/src/bgwin.rs
- `WOW_LIVE_FPS` — benilla-app/src/capture/probes/live_fps.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_LIVE_FPS_AT` — benilla-app/src/capture/probes/live_fps.rs
- `WOW_LIVE_FPS_MOVE` — benilla-app/src/capture/probes/live_fps.rs
- `WOW_LIVE_SHOT` — benilla-app/src/capture/live_shot.rs, benilla-app/src/dev.rs
- `WOW_LIVE_SHOT_AT` — benilla-app/src/capture/live_shot.rs
- `WOW_LIVE_SHOT_COUNT` — benilla-app/src/capture/live_shot.rs
- `WOW_LIVE_SHOT_EVERY` — benilla-app/src/capture/live_shot.rs
- `WOW_LOGIN_SHOT` — benilla-world/src/bgwin.rs
- `WOW_LOGIN_SHOT_OUT` — benilla-app/src/login/screen.rs
- `WOW_LOGIN_SMOKE` — benilla-app/src/char_select/mod.rs, benilla-app/src/login/mod.rs, benilla-app/src/login/smoke.rs, benilla-world/src/bgwin.rs
- `WOW_LOGIN_SMOKE_HOLD` — benilla-app/src/login/smoke.rs
- `WOW_LOGOUT_SMOKE` — benilla-app/src/char_select/mod.rs, benilla-world/src/bgwin.rs
- `WOW_MAP` — benilla-app/src/capture/mod.rs, benilla-world/src/world_map.rs
- `WOW_MATANIM_DUTY` — benilla-world/src/doodad_anim/mat_anim.rs
- `WOW_MATANIM_LIVE` — benilla-world/src/doodad_anim/mat_anim.rs
- `WOW_MATANIM_PROBE` — benilla-world/src/doodad_anim/mat_anim.rs
- `WOW_MERGE_CENSUS` — benilla-world/src/static_merge.rs
- `WOW_MERGE_FADERS` — benilla-world/src/terrain_stream/merge.rs
- `WOW_MERGED_FADE` — benilla-assets/src/materials.rs
- `WOW_MERGED_SLOT` — benilla-assets/src/materials.rs
- `WOW_MESH_EVENTS` — benilla-app/src/perf/mod.rs
- `WOW_MESH_HOLDERS` — benilla-app/src/perf/mod.rs
- `WOW_MESH_TOUCH` — benilla-app/src/perf/mod.rs
- `WOW_MIX_TAP` — benilla-app/src/sound/mix_tap.rs
- `WOW_MM_BLIP_PROBE` — benilla-app/src/minimap/mod.rs, benilla-world/src/bgwin.rs
- `WOW_MM_PROBE` — benilla-app/src/capture/mod.rs, benilla-app/src/minimap/mod.rs, benilla-world/src/bgwin.rs
- `WOW_MM_STATS` — benilla-app/src/minimap/mod.rs
- `WOW_MM_ZOOM` — benilla-app/src/minimap/mod.rs
- `WOW_MOVE_SPEED` — benilla-app/src/player/setup.rs
- `WOW_MOVE_TRACE` — benilla-assets/src/trace.rs
- `WOW_MOVE_TRACE_TAGS` — benilla-assets/src/trace.rs
- `WOW_MSAA` — benilla-app/src/cvars.rs, benilla-world/src/view.rs
- `WOW_MT_EXTRACT` — benilla-app/src/lib.rs
- `WOW_MT_POSTUPDATE` — benilla-app/src/lib.rs
- `WOW_MT_UPDATE` — benilla-app/src/lib.rs
- `WOW_NAME_AZ` — benilla-app/src/capture/mod.rs
- `WOW_NAME_DIST` — benilla-app/src/capture/mod.rs
- `WOW_NAME_EL` — benilla-app/src/capture/mod.rs
- `WOW_NAME_H` — benilla-app/src/capture/mod.rs
- `WOW_NO_ALPHATEST` — benilla-world/src/model_render.rs
- `WOW_NO_ANIM_LOD` — benilla-app/src/creature_anim/lod.rs, benilla-app/src/lib.rs
- `WOW_NO_BC` — benilla-assets/src/gpu_blp.rs
- `WOW_NO_DOODAD_BODIES` — benilla-world/src/terrain_stream/collider.rs
- `WOW_NO_DRAW_ELECTION` — benilla-world/src/exterior_cull.rs
- `WOW_NO_FFX` — benilla-world/src/ffx_glow.rs
- `WOW_NO_FRAME_PACE` — benilla-world/src/frame_pace.rs
- `WOW_NO_HULL_WELD` — benilla-world/src/terrain_stream/weld.rs
- `WOW_NO_INDIRECT` — benilla-app/src/player/setup.rs
- `WOW_NO_LIQUID` — benilla-world/src/liquid/mod.rs
- `WOW_NO_MESH_PARK` — benilla-world/src/model_render/park.rs
- `WOW_NO_MOUNT_TILT` — benilla-app/src/entities/conform.rs
- `WOW_NO_PARTICLES` — benilla-world/src/liquid/drift.rs, benilla-world/src/particles.rs, benilla-world/src/ribbons.rs
- `WOW_NO_RIDE_FRAME` — benilla-world/src/ride_frame.rs
- `WOW_NO_RIG_REBASE` — benilla-world/src/rig_palette.rs
- `WOW_NO_ROOM_LOD` — benilla-app/src/creature_anim/lod.rs
- `WOW_NO_TILE_CELLS` — benilla-world/src/terrain_stream/furnish.rs
- `WOW_NO_TILE_DROP` — benilla-world/src/terrain_stream.rs
- `WOW_NO_TWIST` — benilla-app/src/creature_anim/twist.rs
- `WOW_NODE_PROBE` — benilla-app/src/capture/probes/world_census.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_NOPORTALCULL` — benilla-world/src/dev_state.rs
- `WOW_NOSOUND` — benilla-app/src/sound/mod.rs
- `WOW_NOVSYNC` — benilla-app/src/video.rs, benilla-world/src/worldview.rs
- `WOW_OCEAN_DEPTH_DIV` — benilla-formats/src/liquid.rs
- `WOW_PANEL` — benilla-world/src/dev_state.rs
- `WOW_PART_CHURN` — benilla-app/src/perf/mod.rs
- `WOW_PARTICLE_CENSUS` — benilla-app/src/capture/probes/particle_census.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_PARTICLE_DEPTHDUMP` — benilla-world/src/particles/depthdump.rs
- `WOW_PARTICLE_DEPTHDUMP_BONES` — benilla-world/src/particles/depthdump.rs
- `WOW_PARTICLE_FLAT` — benilla-world/src/particles/render.rs
- `WOW_PARTICLE_NODEPTH` — benilla-world/src/particles/render.rs
- `WOW_PASS` — benilla-app/src/login/mod.rs, benilla-app/src/net.rs, benilla-app/src/run_mode.rs
- `WOW_PERF_HUD` — benilla-app/src/perf/hud.rs
- `WOW_PHASE` — benilla-app/src/capture/phase_probe.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_PHASE_AT` — benilla-app/src/capture/phase_probe.rs
- `WOW_PHASE_COUNT` — benilla-app/src/capture/phase_probe.rs
- `WOW_PHYS_HZ` — benilla-world/src/world_plugins.rs
- `WOW_PHYS_PREPROP` — benilla-world/src/world_plugins.rs
- `WOW_PICK` — benilla-app/src/capture/pick_probe.rs, benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_PICK_AT` — benilla-app/src/capture/pick_probe.rs
- `WOW_PICK_COUNT` — benilla-app/src/capture/pick_probe.rs
- `WOW_PICK_EVERY` — benilla-app/src/capture/pick_probe.rs
- `WOW_PIN_ASPECT` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_COL` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_EYE` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_FLOOR` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_FOVY` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_LOOK` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_MAP` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_SITE` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_TILE` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_UID` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIN_WMO` — benilla-world/src/wmo_portal/audit/pin.rs
- `WOW_PIPE_TRACE` — benilla-app/src/pipe_warm/mod.rs
- `WOW_POINTS_DUMP` — benilla-world/src/lighting/global_light.rs
- `WOW_PORTRAIT_TEST` — benilla-app/src/portrait/mod.rs, benilla-app/src/portrait/test_bake.rs, benilla-world/src/bgwin.rs
- `WOW_PORTRAIT_TEST_SKIN` — benilla-app/src/portrait/test_bake.rs
- `WOW_PROBE` — benilla-app/src/dev.rs, benilla-app/src/lib.rs, benilla-world/src/bgwin.rs
- `WOW_PROBE_AUCTION` — benilla-app/src/dev.rs
- `WOW_PROBE_BANK` — benilla-app/src/dev.rs
- `WOW_PROBE_BG` — benilla-app/src/capture/probe_bg.rs, benilla-app/src/dev.rs
- `WOW_PROBE_BG_SAMPLES` — benilla-app/src/capture/probe_bg.rs
- `WOW_PROBE_BGQUEUE` — benilla-app/src/dev.rs
- `WOW_PROBE_BINDER` — benilla-app/src/dev.rs
- `WOW_PROBE_BOOK` — benilla-app/src/dev.rs
- `WOW_PROBE_CAM` — benilla-app/src/capture/probe_cam.rs
- `WOW_PROBE_CHARCREATE` — benilla-app/src/capture/probe_charcreate.rs, benilla-app/src/dev.rs
- `WOW_PROBE_CHARCREATE_KEEP` — benilla-app/src/capture/probe_charcreate.rs
- `WOW_PROBE_CHARTER` — benilla-app/src/dev.rs
- `WOW_PROBE_CHAT` — benilla-app/src/capture/probes/act.rs, benilla-app/src/dev.rs
- `WOW_PROBE_CHAT_AT` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_CHAT_EVERY` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_CHEST` — benilla-app/src/capture/probe_chest.rs, benilla-app/src/dev.rs
- `WOW_PROBE_CLAM` — benilla-app/src/capture/probe_clam.rs, benilla-app/src/dev.rs
- `WOW_PROBE_DOCK` — benilla-app/src/capture/probe_crossing.rs
- `WOW_PROBE_DRAG` — benilla-app/src/capture/probes/act.rs, benilla-app/src/dev.rs
- `WOW_PROBE_DRAG_AT` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_DRAG_LUA` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_DRAG_STEP` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_EXIT_AT` — benilla-app/src/capture/probes/run.rs, benilla-app/src/dev.rs
- `WOW_PROBE_GMTICKET` — benilla-app/src/dev.rs
- `WOW_PROBE_GOQUEST` — benilla-app/src/capture/probe_goquest.rs, benilla-app/src/dev.rs
- `WOW_PROBE_HOVER` — benilla-app/src/capture/probes/act.rs, benilla-app/src/dev.rs
- `WOW_PROBE_HOVER_AT` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_HOVER_DUTY` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_HOVER_JITTER` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_HOVER_STEP` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_KEY` — benilla-app/src/capture/probes/act.rs, benilla-app/src/dev.rs
- `WOW_PROBE_LOOK` — benilla-app/src/capture/probe_look.rs
- `WOW_PROBE_LUA` — benilla-app/src/capture/probes/act.rs, benilla-app/src/dev.rs
- `WOW_PROBE_LUA_AGAIN` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_LUA_AT` — benilla-app/src/capture/probes/act.rs
- `WOW_PROBE_MAIL` — benilla-app/src/dev.rs
- `WOW_PROBE_MODEL_CAMERA` — benilla-app/src/dev.rs
- `WOW_PROBE_NAME_TRACE` — benilla-app/src/nameplates.rs
- `WOW_PROBE_PARK` — benilla-app/src/capture/probes/run.rs
- `WOW_PROBE_PITCH` — benilla-app/src/capture/probe_pitch.rs
- `WOW_PROBE_RESIZE` — benilla-app/src/capture/probes/run.rs, benilla-app/src/dev.rs
- `WOW_PROBE_SERVICE` — benilla-app/src/dev.rs
- `WOW_PROBE_SHARED_SKIN` — benilla-app/src/entities/attach/char_skin.rs
- `WOW_PROBE_STONE` — benilla-app/src/capture/probe_stone.rs, benilla-app/src/dev.rs
- `WOW_PROBE_UI_ONE_TEX` — benilla-app/src/ui_pass.rs
- `WOW_PROBE_UNCAP` — benilla-app/src/capture/mod.rs
- `WOW_PROBE_VENDOR_SWAP` — benilla-app/src/dev.rs
- `WOW_PROBE_VSYNC` — benilla-app/src/capture/mod.rs
- `WOW_REALM` — benilla-app/src/realm_select/mod.rs
- `WOW_REALM_SMOKE` — benilla-app/src/realm_select/smoke.rs
- `WOW_REFUSE_LOGIN` — benilla-app/src/net/io.rs
- `WOW_REMOTE_FLAT` — benilla-app/src/net/motion/remote.rs
- `WOW_REMOTE_IDLE_GATE` — benilla-app/src/net/motion/remote.rs
- `WOW_REMOTE_SNAP` — benilla-app/src/net/motion/remote.rs
- `WOW_RENDER_SCALE` — benilla-app/src/cvars.rs, benilla-app/src/world_backdrop.rs
- `WOW_RES_CENSUS` — benilla-app/src/perf/census.rs
- `WOW_RESIZE` — benilla-app/src/capture/mod.rs
- `WOW_REVEAL` — benilla-app/src/capture/probes/reveal.rs, benilla-app/src/dev.rs
- `WOW_RIG` — benilla-app/src/capture/probe_rig.rs, benilla-app/src/dev.rs, benilla-app/src/login/mod.rs, benilla-app/src/net.rs, benilla-app/src/probe_shield.rs, benilla-app/src/realm_select/smoke.rs, benilla-app/src/run_mode.rs, benilla-world/src/bgwin.rs
- `WOW_RIG_CENSUS` — benilla-world/src/rig_palette.rs
- `WOW_RIG_COST` — benilla-world/src/rig_palette.rs
- `WOW_RIG_SKIN` — benilla-assets/src/materials.rs
- `WOW_ROW_BLOAT` — benilla-app/src/perf/census.rs, benilla-app/src/perf/mod.rs
- `WOW_SCHED_CENSUS` — benilla-app/src/dev.rs, benilla-world/src/bgwin.rs
- `WOW_SHADE_CENSUS` — benilla-world/src/entity_shade.rs
- `WOW_SHOT_REQUIRE` — benilla-app/src/capture/live_shot.rs
- `WOW_SHOT_REQUIRE_DIST` — benilla-app/src/capture/live_shot.rs
- `WOW_SKY_DEPTH` — benilla-assets/src/materials.rs
- `WOW_SOUND_PROBE` — benilla-app/src/sound/probe.rs
- `WOW_STALL` — benilla-app/src/capture/probes/stall.rs, benilla-app/src/dev.rs
- `WOW_STALL_INJECT` — benilla-app/src/perf/stall.rs
- `WOW_STALL_SAMPLE` — benilla-app/src/perf/stall.rs
- `WOW_STATIC_GX` — benilla-world/src/static_gx/mod.rs
- `WOW_STATIC_GX_FADE` — benilla-world/src/static_gx/mod.rs
- `WOW_STATIC_GX_PROP` — benilla-world/src/static_gx/mod.rs
- `WOW_STATIC_GX_WMO` — benilla-world/src/static_gx/mod.rs
- `WOW_STATIC_MERGE` — benilla-world/src/terrain_stream/merge.rs
- `WOW_STREAM_TRACE` — benilla-app/src/perf/mod.rs
- `WOW_TAB_TRACE` — benilla-app/src/target/scan.rs
- `WOW_TABHOVER` — benilla-app/src/capture/fixtures.rs
- `WOW_TEARDOWN_INJECT` — benilla-app/src/perf/stall.rs
- `WOW_TEXT_PROBE` — benilla-app/src/ui_script/extract/text.rs
- `WOW_THREADS` — benilla-world/src/boot.rs
- `WOW_TILE_DUMP` — benilla-app/src/ui_models/mod.rs
- `WOW_TILE_TRACE` — benilla-app/src/ui_models/mod.rs
- `WOW_TILE_UNLOAD` — benilla-world/src/assets/mod.rs
- `WOW_TINT_PROBE` — benilla-app/src/aura_visual.rs
- `WOW_TRAIL_CENSUS` — benilla-app/src/capture/probes/trail_census.rs, benilla-app/src/dev.rs
- `WOW_TRILINEAR` — benilla-app/src/cvars.rs, benilla-assets/src/tex_filter.rs
- `WOW_TWIST_GAP` — benilla-app/src/player/body_pose.rs
- `WOW_UI_COST` — benilla-app/src/ui_script/extract/mod.rs
- `WOW_UI_DIFF` — benilla-app/src/ui_pass.rs, benilla-app/src/ui_script/extract/mod.rs
- `WOW_UI_GATE` — benilla-app/src/ui_script/extract/mod.rs
- `WOW_UI_HANDLERS` — benilla-ui/src/script/handler_prof.rs
- `WOW_UI_PICK` — benilla-app/src/ui_script/extract/mod.rs
- `WOW_UI_PROBE` — benilla-app/src/ui_pass.rs
- `WOW_UI_SCALE` — benilla-app/src/cvars.rs, benilla-app/src/ui_script/mod.rs
- `WOW_UI_SPLICE_VERIFY` — benilla-app/src/ui_script/extract/mod.rs
- `WOW_UISCRIPT_DUMP` — benilla-app/tests/ui_script_wall.rs
- `WOW_UNATTENDED` — benilla-app/src/login/mod.rs, benilla-app/src/net.rs, benilla-app/src/run_mode.rs, benilla-world/src/bgwin.rs
- `WOW_UNIT_VISUALS` — benilla-app/src/capture/probes/visual_census.rs, benilla-app/src/dev.rs
- `WOW_UNIT_VISUALS_RADIUS` — benilla-app/src/capture/probes/visual_census.rs
- `WOW_UPLOAD_BUDGET` — benilla-world/src/world_plugins.rs
- `WOW_USER` — benilla-app/src/login/mod.rs, benilla-app/src/net.rs, benilla-app/src/run_mode.rs
- `WOW_VIS_DUMP` — benilla-app/src/capture/probes/live_fps.rs
- `WOW_VIS_TRACE` — benilla-world/src/model_render/visibility.rs
- `WOW_VISTA_AT` — benilla-app/src/capture/mod.rs
- `WOW_VISTA_FACE` — benilla-app/src/capture/mod.rs
- `WOW_VISTA_MIN` — benilla-app/src/capture/mod.rs
- `WOW_VISTA_PITCH` — benilla-app/src/capture/mod.rs
- `WOW_VPLATE_TRACE` — benilla-app/src/vplates.rs
- `WOW_WARM_SLICE` — benilla-app/src/pipe_warm/mod.rs
- `WOW_WATER_CLIP` — benilla-assets/src/materials.rs
- `WOW_WAVE_DUMP` — benilla-world/src/ffx_glow.rs
- `WOW_WEATHER` — benilla-world/src/weather/mod.rs
- `WOW_WEATHER_DUMP` — benilla-world/src/weather/mod.rs
- `WOW_WFX_AGE` — benilla-app/src/capture/mod.rs
- `WOW_WFX_AT` — benilla-app/src/capture/mod.rs
- `WOW_WFX_AZ` — benilla-app/src/capture/mod.rs
- `WOW_WFX_DEPTH` — benilla-app/src/capture/mod.rs
- `WOW_WFX_DIST` — benilla-app/src/capture/mod.rs
- `WOW_WFX_EL` — benilla-app/src/capture/mod.rs
- `WOW_WFX_HEAD` — benilla-app/src/capture/mod.rs
- `WOW_WFX_MODE` — benilla-app/src/capture/mod.rs
- `WOW_WFX_SPEED` — benilla-app/src/capture/mod.rs
- `WOW_WIN` — benilla-app/src/video.rs, benilla-world/src/worldview.rs
- `WOW_WMO_BIAS` — benilla-world/src/model_render.rs, benilla-world/src/static_gx/mod.rs
- `WOW_WORLDVIEW_` — benilla-world/src/bgwin.rs
- `WOW_WORLDVIEW_AT` — benilla-world/src/worldview.rs
- `WOW_WORLDVIEW_CHECK` — benilla-world/src/bgwin.rs, benilla-world/src/worldview.rs
- `WOW_WORLDVIEW_SHOT` — benilla-world/src/worldview.rs
- `WOW_WORLDVIEW_SHOT_AT` — benilla-world/src/worldview.rs
- `WOW_WORLDVIEW_SURVEY` — benilla-world/src/worldview.rs
## Scripts (`scripts/`)
- `doc-links.py` — fail on a doc link whose target does not exist ANYWHERE in the workspace.
- `gen-message-catalog.py` — Generate `crates/benilla-ui/src/messages/catalog.rs` from wow-5875-re's message-catalog.tsv.
- `gen-reference-events.py` — Regenerate `reference/1.12-events.tsv` — every FrameScript event the 1.12.1 client can dispatch, with the ARGUMENTS its producers push.
- `gen-reference-globals.py` — Regenerate `reference/1.12-globals.tsv` — the 1.12.1 client's global namespace, with each name attributed to whoever provides it.
- `gen-reference-verb-events.py` — Regenerate `reference/1.12-verb-events.tsv` — every FrameScript event the 1.12.1 client fires FROM INSIDE A LUA VERB, keyed by the verb.
- `mixsum.py` — read a `$WOW_MIX_TAP` capture and say, in numbers, what the mix was doing when.
- `pass-span-lint.py` — one `pass_span` per render pass at a time (decision 2258, bug B390).
- `soundprobe.py` — read back a `$WOW_SOUND_PROBE` capture and name the mechanism.
- `vplsum.py` — Read a `vpl`/`bub` overlay trace and say WHERE the overlay's motion came from — projection, solve, or snap.
- `api-coverage.sh` — The addon-API coverage instrument (decisions 1178 §, 1188 phase 0, 1189) — how much of the 1.12.1 client's global surface benilla presents, measured o…
- `check.sh` — the ROUND's verify (decision 1822): fmt everywhere (cheap), clippy + test scoped to the crates this round's changes can actually affect — the changed …
- `cine.sh` — play one cinematic on the probe and print what happened, as a timeline.
- `crosscheck.sh` — compile benilla for the platforms the gates cannot see.
- `gates.sh` — The commit gates (docs/METHOD.md "Gates"), one vetted runner: fmt-check → clippy -D warnings → workspace tests (skips refused where the data is) → doc…
- `genmap.sh` — Generate docs/MAP.md — the "what's built" map — derived entirely from what's on disk so it cannot drift (docs/METHOD.md / docs/METHOD.md: "the generat…
- `leg.sh` — the interleaved A/B leg runner (1353 law 1, mechanized).
- `smoke.sh` — The fourth gate, as a command.
- `soundprobe.sh` — start the client in MEASURING MODE (decision 1556).
- `summon-live.sh` — The two-client live summon probe (decision 1747) — the instrument that closes the loop on being summoned, because nothing smaller can.
- `visual.sh` — Phase-5 visual A/B render harness driver (decisions 0008 + 0010).
- `vkleg.sh` — run the client on VULKAN before it ships: a Linux container, Mesa's software Vulkan driver (lavapipe), a virtual display, and a handful of capture sce…
- `wt.sh` — the session-worktree pool (decisions 0192 + 0433).
+123
View File
@@ -0,0 +1,123 @@
# METHOD — how benilla is built
benilla is a from-scratch World of Warcraft 1.12.1 client in Rust and Bevy. It reads the game's
data from the player's own install, speaks the original protocol to any 1.12.1 server, and does
not build a server or simulate the game. The reference client is the spec: benilla does what
1.12.1 does, as a modern, idiomatic client.
## The rule for every change
A change is right 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. A deviation from the reference is the
maintainer's call alone, and each one is written down where it lives: a CVar's `Deviates` row, a
comment naming the reference fact and why we differ. Anything else is a fork.
## The loop
1. **The reference first.** For anything fidelity-defining, get the mechanism from the real
client before building: its behaviour, a DBC field, a FrameXML line, a packet capture. The
names and shapes under `reference/` are the surface benilla tracks.
2. **Build it idiomatically.** Modern Bevy and Rust, performance woven in from the start.
Implement the mechanism well; do not ape a quirk that is a bug.
3. **Measure, never eyeball.** Timing, delay, ordering and feel are settled with instruments:
trace timestamps, byte-derived numbers, a numeric probe. A capture confirms an existence
fact; it cannot measure time. Never search for a viewpoint: take the one simplest shot, and
if it does not settle the question, hand over a precise script ("log in, look at X, does Y?").
4. **Close the loop on the symptom.** A bug reported as seen is closed by reproducing it at the
reported spot first, fixing, and showing the same instrument clean there plus one adjacent
state. Green gates and an existing mechanism are never that evidence.
5. **Prove the run before reading the result.** A live result is evidence once the run is valid
from numbers: preflight banner clean, camera and body where intended, the subject in frame,
the window long enough. A negative from an unproven run is not evidence.
6. **Commit small and often.** Atomic units, explicit paths; main only advances by fast-forward.
No "done" and no commit without saying what was verified and how the result was judged.
## Hard rules
- **Never commit anything from the install.** Art, models, sounds, maps, data: the install is
read at runtime from a gitignored path, and everyone provides their own. The one exception is
interface code: FrameXML and GlueXML run off the player's own patch chain, and the copies
already under `assets/ui` stay until they retire.
- **The install is read-only.** benilla never writes into the WoW folder: no screenshot, log,
cache or scratch file. A hook blocks such a write at the tool call, and `scripts/smoke.sh`
fails a run that leaves the install changed.
- **Local state lives in one folder**, `benilla-config/` beside the binary, and every path to
it resolves through `crate::local_state`. Player settings are CVars persisted as a diff in
`benilla-config/config.toml`.
- **UI is stock-first: a window is migrated, not authored.** The end state is the stock 1.12
FrameXML executed off the player's own chain. `assets/ui` does not grow: a test names its
files and fails on a new one. A window is built by pointing `benilla.toc` at the stock file,
deleting ours and building the engine verbs it calls, never stubbing one to make the file
load.
- **A setting's default is the reference's default.** Every option boots at the stock 1.12
value. Shipping another value costs an explicit `Deviates` row with the reason, and a test
fails a row that drifts either way.
- **Our code is MIT OR Apache-2.0**, which is a claim about provenance: no original client
code, no bundled assets.
## Where things live
- `docs/METHOD.md`, this file: rules and method. Never state, never a log.
- `docs/MAP.md`: what is built, generated from the code by `scripts/genmap.sh` at every land.
Read it to orient; never edit or commit it by hand.
- git: the history. No changelogs, no status docs, no "what we did" narratives.
- The code: a comment says what the code does and the 1.12 fact behind it, in a line. No
history, no stories.
- `.claude/skills/`: procedures with steps. `probe` runs the client unattended against the local
server.
## Gates
- **The land gates**: `cargo fmt --all -- --check`, `cargo clippy --workspace --all-targets
-- -D warnings`, `cargo test --workspace`, the player build without the `dev` feature and the
engine boot checks, as `scripts/gates.sh`. `wt.sh land` runs it on the tree that lands; it is
memoized on the tree.
- **Per round**: `scripts/check.sh`, scoped to the changed crates and their dependents. Run each
gate once per round; `tee` the output to a file and grep the file.
- **A clean run** is the fourth gate: `scripts/smoke.sh`, a live login and logout against the
local server. For wire work the gate is a live run with a trace (`WOW_MOVE_TRACE=<path>`,
tags filtered), never a capture: capture mode has no network.
- **Platform seams**: a `cfg(target_os)`, a `[target.'cfg(…)']` dependency, a `#[link]` or an
`extern "system"` is invisible to the macOS gates. `scripts/crosscheck.sh` compiles Linux and
Windows, and the land worker runs it when the diff touches a seam.
- **Vulkan**: `scripts/vkleg.sh` runs the client on Vulkan in a container before a release,
because Metal cannot ask what Vulkan validation refuses.
- Hooks enforce only two things: no writes into the install, and the worktree rule on a machine
with a pool. Everything else is a gate or discipline.
## Worktrees
On a machine with a pool, every session works in its own slot and `scripts/wt.sh` is the only
way to get one. `claim <name>` at the start; `land <name>` at the end, which rebases,
regenerates the map, runs the full gate chain, fast-forwards and pushes main and releases the
slot, one land at a time; `release` to abandon; `status` to see the pool. Never the primary
checkout, which belongs to no session and stays clean, and never the harness worktree tool or a
hand-rolled `git worktree add`. Work against the slot by path: prefix Bash calls with
`cd <slot> &&` and give edits absolute paths under it. No free slot means stop and ask which
one to take over, never fall back to the primary. Hooks enforce all of this.
Sessions share the machine, so a kill is scoped to a PID, never to a command pattern:
`pkill -f "cargo test"` takes out every neighbour's gates along with yours.
On a plain clone there is no pool: work on a branch and open a pull request.
## The local server
benilla talks to a local vmangos (build 5875); `WOW_HOST`, `WOW_USER`, `WOW_PASS` and `WOW_CHAR`
override the defaults. These bind every session and every agent:
- A probe logs in as its own probe account (`probeN` for `pool-N`), never as a player's: a login
kicks whoever holds the account.
- Every unattended run says so: `WOW_UNATTENDED=1`. An agent's run is silent: `WOW_NOSOUND=1`.
- No unattended combat probes.
- Anything about hostility, reaction colour, nameplates, threat, damage or breath runs with
`WOW_GM=off`.
- Read the preflight banner before debugging anything else.
The mechanics are the `probe` skill.
## Agents in a shared tree
Parallel agents share one working tree: whole-tree git ops (`stash`, `reset --hard`,
`clean -f`, a pathless `checkout`) are forbidden, diagnostics use path-scoped commands, and an
agent never gets a tree of its own.