the signals and their derived score are provisional and subject to change.
validate manually before sharing.
cdf6c1e41d3ba130db21557859b7671c61229cb9none
# bullet-classic
Files and responsibilities: `README.md`. Decisions: ADR-030 to ADR-033.
## Retargeted skin bins
- A retargeted skin bin is the source bin relocated, nothing more. `retarget_skin_bin` keeps only the skin object
and its Resources, re-keyed to slot 0; every `link`/`hash` value that pointed at the old keys is rewritten to the
new ones (`remap_references`).
- `skinClassification` and `skinParent` take the values of the game's own bin for the target slot
(`slot_identity`, never a constan# bullet-platform
Files and responsibilities: `README.md`. Interface decision: ADR-035.
## Interface (Slint)
- One `bullet-ui` thread owns the Slint event loop; logic lives in Rust (`overlay_model.rs`), the `.slint` files
only lay out and bind.
- The overlay never takes focus on its own. It is created without activation and shown with `SW_SHOWNOACTIVATE`;
only a click in its search box takes the foreground (thread-input attach), and Enter or Escape gives it back to
the client, because stealing focu# bullet-inject
Files and responsibilities: `README.md`. Trust model: `docs/security.md` and ADR-036.
## Overlay
- The overlay is built byte-faithful: unchanged entries keep the game's exact compressed bytes and every cloned WAD
keeps the game's header (signature and checksum). Patch 16.19 rejected a map WAD rewritten with another header or
recompressed as corrupt (`Map11.wad.client`).
- A path a map WAD also holds changes in every WAD that holds it. Changing one side only is the "Inconsistent"
cra# CLAUDE.md — Bullet
Bullet is a League of Legends skin changer for Windows, in Rust. It follows champion select through the client's
local API (LCU), generates the chosen skin from the installed game, builds an overlay of WAD archives and has the
game read it through the LTK injector (`ltk_patcher_host.exe` + `ltk_patcher_dll.dll`). The product in one
sentence: the right skin loads into the game, in every mode, every time. In production; releases are in
`CHANGELOG.md`. `AGENTS.md` points here.
Bullet i# bullet-wad
Files, formats and responsibilities: `README.md`. Decision: ADR-021.
- This parser stays our own (no `cdragon-*`) for full control over all five entry types and the bounds checks.
- Every offset, length and count read from a file is bounds-checked and capped before allocating; out of range is a
typed error, never a panic. The fuzzer found an allocation abort in the PROP header once; new readers get a fuzz
target and a property test.
- The writer keeps the game's header and unchanged entri# Rust
target/
**/target/
# Dependências
node_modules/
vendor/
.venv/
__pycache__/
*.pyc
.mypy_cache/
# Build / outputs
dist/
build/
out/
installer/Output/
relay-worker/.wrangler/
# Locks (ler apenas quando necessário)
Cargo.lock
package-lock.json
yarn.lock
pnpm-lock.yaml
# Dados e binários do jogo / mods
*.wad
*.wad.client
*.fantome
*.bin
hashes.game.txt
wad_index.bin
*.csv
*.parquet
*.xlsx
*.pdf
*.png
*.jpg
*.jpeg
*.svg
*.ico
*.woff
*.woff2
*.dll
*.exe
*.zip
# Diagnósticos locais e saídas de fer# AGENTS.md — Bullet
> **Pointer file.** The canonical context for any AI agent working on this project is **`CLAUDE.md`** at the
> repository root. Read it first. This file only exists so tools that look for `AGENTS.md` find the way there;
> keeping two full copies made them drift apart in the past.
## Start here
| Need | Where |
| --- | --- |
| What the project is, critical rules, key decisions | `CLAUDE.md` |
| Architecture, flows, build and CI, logs, security | `docs/` |
| What a crate does and whi.gitignoreclaude-code.claude/.gitignoreunspecified.agents/.gitignoreclaude-codeCLAUDE.local.md