Part of #41: the comments of `benilla-assets`, Rust and WGSL, rewritten to the rule in `docs/METHOD.md`: what the code does and the reference fact behind it, in a line. 3,872 comment lines become 1,568.
- The citations that were only a private record number go first, mechanically, each edit shown to be a pure removal.
- The rewrite corrects the comments that stated wrong facts: the alpha-key cutoff now cites the reference's per-blend-mode table (`0x85ad20`), the texture-filter note names the subsystems that ignore the global setting, a test doc said an exhausted variation roll returns the last variation (it returns the first), and about twenty more found on the way (renamed or deleted items, a shader flag the doc misread, docs sitting on the wrong function). "Deviation:" now marks only a choice with a reason; an unbuilt behaviour says so plainly.
- Verified: every file strips to identical code, and `cargo fmt --check` is clean. A second reader compared every file old against new, restored the facts the rewrite had dropped, and checked each new citation against the reference.
String literals are untouched; they are #92.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Part of #41: the comments of the thirteen small crates (`benilla-adt`, `-blp`, `-buildstamp`, `-bytes`, `-dbc`, `-m2`, `-mpq`, `-srp`, `-visual`, `-wdt`, `-wmo`, `-worldview` and `benilla`) rewritten to the rule in `docs/METHOD.md`: what the code does and the reference fact behind it, in a line. 2,176 comment lines become 1,029.
- The citations that were only a private record number go first, mechanically, each edit shown to be a pure removal.
- The rewrite corrects the comments that stated wrong facts: the M2 header's selection-ring claim, the texture-transform and MCNK impassable-flag notes, a DBC reader note that said short records zero-pad (they do not, #17), and about twenty more found on the way. The SRP handshake's redraw and redial are marked as a deviation, with the measured reason.
- Verified: every file strips to identical code, and `cargo fmt --check` is clean. A second reader compared every file old against new and restored the facts the rewrite had dropped.
String literals are untouched; they are #92.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Part of #41: the comments of the thirteen small crates (`benilla-adt`, `-blp`, `-buildstamp`, `-bytes`, `-dbc`, `-m2`, `-mpq`, `-srp`, `-visual`, `-wdt`, `-wmo`, `-worldview` and `benilla`) rewritten to the rule in `docs/METHOD.md`: what the code does and the reference fact behind it, in a line. 2,176 comment lines become 1,029.
- The citations that were only a private record number go first, mechanically, each edit shown to be a pure removal.
- The rewrite corrects the comments that stated wrong facts: the M2 header's selection-ring claim, the texture-transform and MCNK impassable-flag notes, a DBC reader note that said short records zero-pad (they do not, #17), and about twenty more found on the way. The SRP handshake's redraw and redial are marked as a deviation, with the measured reason.
- Verified: every file strips to identical code, and `cargo fmt --check` is clean. A second reader compared every file old against new and restored the facts the rewrite had dropped.
String literals are untouched; they are #92.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comments that named a chat reporter, cited a chat channel or message id, or quoted a report word for word now state the symptom in their own words. The test fixtures that used real character names use invented ones.
Verified: 52 of the 56 files strip to identical code with their comments removed; the other 4 differ only in the fixture names, and with those mapped back they strip identical too. `cargo fmt --check` is clean, and the `ui_party`, `unit_frame_tests` and `capture` tests pass with the install present and no skips. Record numbers still in these comments go with the comment pass (#41).
Fixes#34🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comments that named a chat reporter, cited a chat channel or message id, or quoted a report word for word now state the symptom in their own words. The test fixtures that used real character names use invented ones.
Verified: 52 of the 56 files strip to identical code with their comments removed; the other 4 differ only in the fixture names, and with those mapped back they strip identical too. `cargo fmt --check` is clean, and the `ui_party`, `unit_frame_tests` and `capture` tests pass with the install present and no skips. Record numbers still in these comments go with the comment pass (#41).
Fixes#34🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comments that pointed into the maintainer's private reverse-engineering notes (a note by name, a
path, a section or finding id, the analysis's own name for a client function, a process word) now
carry the fact itself, cited by the reference client's address, by vmangos file and line, or as
"the reference". Nobody outside could follow those pointers.
Comment text only, plus the test-assert and log strings that carried the same pointers. No claim
changes: a comment the notes have since corrected keeps its wording here, and correcting it is
separate work.
The two reference generators, `scripts/gen-reference-globals.py` and
`scripts/gen-reference-verb-events.py`, named the private notes' layout to find their inputs. They
now take the input files as arguments (`--capture`, `--framexml`, `--names`, `--extents`,
`--disasm`). Run on the same inputs, both write the committed tables row for row; only the two
header lines that named the old environment variable change.
Checked per file:
- the code is identical: each file with its comments stripped compares equal before and after; a
changed string literal is compared under a mask that proves only literal text moved and every
literal kept its line count;
- no client address the old text cited was dropped;
- a second reviewer checked every added address against its derivation;
- a detector for the notes' names, paths, ids, function names and process words finds none left;
- `scripts/gates.sh` is green.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comments that pointed into the maintainer's private reverse-engineering notes (a note by name, a
path, a section or finding id, the analysis's own name for a client function, a process word) now
carry the fact itself, cited by the reference client's address, by vmangos file and line, or as
"the reference". Nobody outside could follow those pointers.
Comment text only, plus the test-assert and log strings that carried the same pointers. No claim
changes: a comment the notes have since corrected keeps its wording here, and correcting it is
separate work.
The two reference generators, `scripts/gen-reference-globals.py` and
`scripts/gen-reference-verb-events.py`, named the private notes' layout to find their inputs. They
now take the input files as arguments (`--capture`, `--framexml`, `--names`, `--extents`,
`--disasm`). Run on the same inputs, both write the committed tables row for row; only the two
header lines that named the old environment variable change.
Checked per file:
- the code is identical: each file with its comments stripped compares equal before and after; a
changed string literal is compared under a mask that proves only literal text moved and every
literal kept its line count;
- no client address the old text cited was dropped;
- a second reviewer checked every added address against its derivation;
- a detector for the notes' names, paths, ids, function names and process words finds none left;
- `scripts/gates.sh` is green.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The probe skill was a Claude-only file, and its promises held on one machine: its shield needs an
account named probe and digits, which CONTRIBUTING never asks for, and its long-run advice was
macOS's. The switches every checkout has for an unattended run are plain text in CONTRIBUTING
now, read by any tool; METHOD points there, AGENTS.md drops the skills folder, and .gitignore
leaves .claude/ to each person.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The probe skill was a Claude-only file, and its promises held on one machine: its shield needs an
account named probe and digits, which CONTRIBUTING never asks for, and its long-run advice was
macOS's. The switches every checkout has for an unattended run are plain text in CONTRIBUTING
now, read by any tool; METHOD points there, AGENTS.md drops the skills folder, and .gitignore
leaves .claude/ to each person.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A committed .claude/settings.json bound everyone who opens the repo in Claude Code: it switched
their auto memory off, and its one hook guarded the install against Claude's Edit and Write
tools only, never a write through the shell or by another agent. The rule it backed is enforced
for every tool by the code and by scripts/smoke.sh's install watch, which METHOD now cites. jq is
no longer a prerequisite, and .gitignore shares only the skills under .claude/.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A committed .claude/settings.json bound everyone who opens the repo in Claude Code: it switched
their auto memory off, and its one hook guarded the install against Claude's Edit and Write
tools only, never a write through the shell or by another agent. The rule it backed is enforced
for every tool by the code and by scripts/smoke.sh's install watch, which METHOD now cites. jq is
no longer a prerequisite, and .gitignore shares only the skills under .claude/.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The issue form asks for what happened, with only that field required, then what 1.12.1 does,
how to see it, and the build line. Blank issues stay open, and questions point to the Discord.
The pull request template asks what changes, the 1.12.1 fact behind it, and how it was checked.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The issue form asks for what happened, with only that field required, then what 1.12.1 does,
how to see it, and the build line. Blank issues stay open, and questions point to the Discord.
The pull request template asks what changes, the 1.12.1 fact behind it, and how it was checked.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The options window, the ESC menu and the key bindings page follow the 1.15 era client because
1.12's settings screens are much worse to use.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The options window, the ESC menu and the key bindings page follow the 1.15 era client because
1.12's settings screens are much worse to use.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The workflow that closed every pull request on arrival is gone, the README's closed-doors
notice becomes a short Contributing section, and CONTRIBUTING.md says how to report a bug.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The workflow that closed every pull request on arrival is gone, the README's closed-doors
notice becomes a short Contributing section, and CONTRIBUTING.md says how to report a bug.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The 1.12 highlight is not a fixed 64/255 lift. SetHighlight samples the
scene's committed ambient (read at 0x614576-0x6145bd), and every batch
adds it to its colour before the final clamp, lit or unlit.
0xff404040 is only the fallback before a map's light loads. The
highlight now follows the time of day, zone and weather: roughly
(29, 60, 84)/255 at night to (104, 130, 154)/255 at noon, where it was
always (64, 64, 64)/255.
Unlit M2 batches in blend modes 0 to 4 now draw
texel × clamp(tint·M2Color + highlight), the unlit program's c28 + c29.
They took no highlight before. The reference holds the ambient sampled
when a highlight begins; benilla samples it live, a marked deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The 1.12 highlight is not a fixed 64/255 lift. SetHighlight samples the
scene's committed ambient (read at 0x614576-0x6145bd), and every batch
adds it to its colour before the final clamp, lit or unlit.
0xff404040 is only the fallback before a map's light loads. The
highlight now follows the time of day, zone and weather: roughly
(29, 60, 84)/255 at night to (104, 130, 154)/255 at noon, where it was
always (64, 64, 64)/255.
Unlit M2 batches in blend modes 0 to 4 now draw
texel × clamp(tint·M2Color + highlight), the unlit program's c28 + c29.
They took no highlight before. The reference holds the ambient sampled
when a highlight begins; benilla samples it live, a marked deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
For blend modes 5 and 6 the reference zeroes the tint·M2Color term and
forces the primary colour to the blend identity (0x70c507/0x70c5b8),
keeping only the alpha. benilla multiplied the batch's M2Color (baked
into its vertex colours, or animated through the material tint) and the
body tint into the texel. Mod and Mod2x batches now bake no M2Color, and
the shader draws them from the bare texel; the alpha still reaches them
through the identity lerp.
Of the install's 615 Mod and Mod2x batches, four carry a non-white
M2Color and none an animated one. The Scholomance testing jars (empty,
ghoul and skeleton) lose the (0.93, 1.00, 0.54) cast on their Mod layer,
and Offhand_Naxxramas_D_01's Mod2x sheen loses its (1.00, 0.95, 0.85)
warmth.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
For blend modes 5 and 6 the reference zeroes the tint·M2Color term and
forces the primary colour to the blend identity (0x70c507/0x70c5b8),
keeping only the alpha. benilla multiplied the batch's M2Color (baked
into its vertex colours, or animated through the material tint) and the
body tint into the texel. Mod and Mod2x batches now bake no M2Color, and
the shader draws them from the bare texel; the alpha still reaches them
through the identity lerp.
Of the install's 615 Mod and Mod2x batches, four carry a non-white
M2Color and none an animated one. The Scholomance testing jars (empty,
ghoul and skeleton) lose the (0.93, 1.00, 0.54) cast on their Mod layer,
and Offhand_Naxxramas_D_01's Mod2x sheen loses its (1.00, 0.95, 0.85)
warmth.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The doc said repeat equals clamp for UVs in 0..1. Under linear
filtering a repeating sampler wraps at the edge, so terrain.wgsl insets
the alpha UVs by half a texel to clamp instead.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The doc said repeat equals clamp for UVs in 0..1. Under linear
filtering a repeating sampler wraps at the edge, so terrain.wgsl insets
the alpha UVs by half a texel to clamp instead.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Thirteen now assert what they claimed:
- every bare trade status, and the 444-byte extended snapshot for
empty, full and mixed slots;
- the status-1 and status-3 battlefield tails;
- every quest-share verdict byte through encode, parse and decode;
- the greeting pick itself, and the whole compressed-move batch.
Eleven are renamed to what they check, where the claim had nothing to
check against: no capture bytes, no production opcode list, no server
encoder. No strengthened assertion failed.
Probe and assert messages drop their record numbers. The aura probe's
refusal message no longer claims the level-6 probe accounts need a
grant for a level-4 command.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Thirteen now assert what they claimed:
- every bare trade status, and the 444-byte extended snapshot for
empty, full and mixed slots;
- the status-1 and status-3 battlefield tails;
- every quest-share verdict byte through encode, parse and decode;
- the greeting pick itself, and the whole compressed-move batch.
Eleven are renamed to what they check, where the claim had nothing to
check against: no capture bytes, no production opcode list, no server
encoder. No strengthened assertion failed.
Probe and assert messages drop their record numbers. The aura probe's
refusal message no longer claims the level-6 probe accounts need a
grant for a level-4 command.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
vmangos always sends 1.0, meaning none (Player.cpp:3039), so 1.12
shows no group-bonus line against it either.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
vmangos always sends 1.0, meaning none (Player.cpp:3039), so 1.12
shows no group-bonus line against it either.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
BENILLA_FALLBACK_ICON held the fourth archive path the sweep counts, and
it is gone. The floor exists so the sweep never passes by matching
nothing, and it comes down as paths leave.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
BENILLA_FALLBACK_ICON held the fourth archive path the sweep counts, and
it is gone. The floor exists so the sweep never passes by matching
nothing, and it comes down as paths leave.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,065 comment lines become 340; the code is unchanged. Corrected:
- CMSG_CANCEL_CAST carried CMSG_CANCEL_AURA's doc;
- the inspect reply is parsed, then dropped;
- mount failures reach the player as error lines, so they are no
longer a deviation;
- the pet-stable note moves from SMSG_INVALIDATE_PLAYER to the stable
constants.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,065 comment lines become 340; the code is unchanged. Corrected:
- CMSG_CANCEL_CAST carried CMSG_CANCEL_AURA's doc;
- the inspect reply is parsed, then dropped;
- mount failures reach the player as error lines, so they are no
longer a deviation;
- the pet-stable note moves from SMSG_INVALIDATE_PLAYER to the stable
constants.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,040 comment lines become 387; the code is unchanged. The note that
item objects have no decode path is gone, since the same file decodes
them.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,040 comment lines become 387; the code is unchanged. The note that
item objects have no decode path is gone, since the same file decodes
them.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,039 comment lines become 472 across 19 files; the code is unchanged.
The movement test's claim that write() never serializes a transport
tail is gone: it does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,039 comment lines become 472 across 19 files; the code is unchanged.
The movement test's claim that write() never serializes a transport
tail is gone: it does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,071 comment lines become 370 across 23 files; the code is unchanged.
The Warden refusal and the billing-time default now carry their reasons.
A gap note on cyclic splines described the app, not this crate, and is
gone.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,071 comment lines become 370 across 23 files; the code is unchanged.
The Warden refusal and the billing-time default now carry their reasons.
A gap note on cyclic splines described the app, not this crate, and is
gone.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,081 comment lines become 459; the code is unchanged. Corrections:
- MonsterMove's description sat atop MoveTimeSkipped's doc and
documented the wrong variant; it is back on MonsterMove.
- GossipMenu's tuple doc gains its missing level.
- Four false claims are gone: "only primitives" on SessionEvent, a
code field LoginFailed does not have, a broken object_scale link,
and "filled from nothing else" on SpellChainTargets.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,081 comment lines become 459; the code is unchanged. Corrections:
- MonsterMove's description sat atop MoveTimeSkipped's doc and
documented the wrong variant; it is back on MonsterMove.
- GossipMenu's tuple doc gains its missing level.
- Four false claims are gone: "only primitives" on SessionEvent, a
code field LoginFailed does not have, a broken object_scale link,
and "filled from nothing else" on SpellChainTargets.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
812 comment lines become 264; the code is unchanged. JumpInfo's doc
called zspeed up-positive, against its own captured fact and every
consumer, which negate it; the up-positive formulas are gone.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
812 comment lines become 264; the code is unchanged. JumpInfo's doc
called zspeed up-positive, against its own captured fact and every
consumer, which negate it; the up-positive formulas are gone.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,079 comment lines become 390; the code is unchanged. Corrected
against the code:
- area spirit healers are modelled;
- the resurrect name length is skipped, not cross-checked;
- SMSG_CHAT_WRONG_FACTION is handled in parse.rs, not chat.rs.
AFK/DND clearing in the member snapshot matches the reference and is no
longer called a deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,079 comment lines become 390; the code is unchanged. Corrected
against the code:
- area spirit healers are modelled;
- the resurrect name length is skipped, not cross-checked;
- SMSG_CHAT_WRONG_FACTION is handled in parse.rs, not chat.rs.
AFK/DND clearing in the member snapshot matches the reference and is no
longer called a deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,071 comment lines become 573; the code is unchanged. The world
probe's field docs are its --help text, so the help is shorter now and
matches what each flag runs: --quest takes quest 783 from Willem to
McBride, --quest-item needs the starter item to survive, --giverstatus
queries once, --spells makes three casts. Also corrected:
- the aura-duration packet has a SessionEvent;
- the SRP xor hash is SHA1(N) XOR SHA1(g), not a hash of it;
- the cooldown probe picks Tri, else the first character.
benilla sending a stored integrity hash instead of hashing the install
is now marked as a deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,071 comment lines become 573; the code is unchanged. The world
probe's field docs are its --help text, so the help is shorter now and
matches what each flag runs: --quest takes quest 783 from Willem to
McBride, --quest-item needs the starter item to survive, --giverstatus
queries once, --spells makes three casts. Also corrected:
- the aura-duration packet has a SessionEvent;
- the SRP xor hash is SHA1(N) XOR SHA1(g), not a hash of it;
- the cooldown probe picks Tri, else the first character.
benilla sending a stored integrity hash instead of hashing the install
is now marked as a deviation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1,082 comment lines become 487; the code is unchanged. The creature
query doc said the display id was dropped; CreatureQueryInfo keeps it.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>