Commit graph

359 commits

Author SHA1 Message Date
Erik
e4960eae5e build(frontend): deploy integer OD rendering
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 19:14:58 +02:00
Erik
9f908aed9e fix(inventory-go): backfill-od clears stale od_rating for non-matching weapons
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 19:12:40 +02:00
Erik
2395bd6267 feat(frontend): render weapon OD as integer (0-10 loot-profile scale)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 19:10:03 +02:00
Erik
cbc8785c47 feat(inventory-go): recompute OD from VTank loot-profile ladder (0-10 / casters 0-7)
Replaces the UtilityBelt over-retail float with the user's actual in-game OD:
per-weapon-type MaxDamage/elemVsMon thresholds from Loot.utl. Bows/thrown
deferred (null) pending a computed-stat calibration. (L) Dagger MS bucket
folded into (L) Dagger (indistinguishable by captured fields).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 19:09:22 +02:00
Erik
7a11122a26 docs: spec + plan to recompute OD from VTank loot profile (0-10 scale)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 19:06:02 +02:00
Erik
cc403240d6 build(frontend): deploy weapon-type-by-skill filter + OD column
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:50:39 +02:00
Erik
29f8bec046 fix(frontend): only show weapon-type chips when item type is Weapons
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:48:27 +02:00
Erik
d6fa0fa9b0 feat(frontend): multi-select weapon-type-by-skill filter + auto OD column
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:44:00 +02:00
Erik
b4bee24773 feat(inventory-go): weapon_types multi-select filter by skill (melee/missile/war/void)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:41:43 +02:00
Erik
29d400f86a docs: spec + plan for weapon-type-by-skill multi-select filter + OD column
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:38:18 +02:00
Erik
d5febaabda build(frontend): deploy weapon OD rating
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:23:07 +02:00
Erik
1dd95819c7 feat(frontend): weapon OD rating filter, column, and detail row
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 08:22:54 +02:00
Erik
fb6b54f9bd feat(inventory-go): min_od/max_od search filters + od sort
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:05:03 +02:00
Erik
3c0a8d9de8 feat(inventory-go): POST /admin/backfill-od recompute endpoint
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:04:00 +02:00
Erik
e07a9459cd feat(inventory-go): store od_rating at ingest + schema column
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:03:57 +02:00
Erik
9b2f28d942 fix(inventory-go): add Prodigal Spirit Drinker effect; document dmgMod key substitution; test wand mastery fallback
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 08:00:22 +02:00
Erik
99f394d1ef docs(spec): OD — add missing Prodigal Spirit Drinker effect, document dmgMod key substitution
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:58:36 +02:00
Erik
f75a236f54 fix(inventory-go): OD variance orientation per UB source; exact SpellInfo change/bonus semantics; missile golden test
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 07:46:07 +02:00
Erik
16077633c5 docs: correct OD spec/plan — variance orientation per UB source, SpellInfo change/bonus semantics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:43:26 +02:00
Erik
231e6e799f feat(inventory-go): Mag-Tools OD weapon rating calculation (od.go)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 07:39:49 +02:00
Erik
f92d158fd0 docs(plan): weapon OD rating implementation plan
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:29:10 +02:00
Erik
10f8d135e5 docs(spec): weapon OD rating — compute at ingest, filter in search
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:26:32 +02:00
Erik
71f235c8b1 feat(frontend): inventory item-state filter — Any/Equipped/Not equipped radios, moved under Characters
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:59:22 +02:00
Erik
4e1b9f4a1f build(frontend): deploy hardened inventory search
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:43:07 +02:00
Erik
edbf7086a6 fix(frontend): harden inventory search — q= validation, error boundary, stable selection, URL throttle
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:41:54 +02:00
Erik
ae24cad458 build(frontend): deploy inventory search redesign
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:31:25 +02:00
Erik
66ee4bd82b feat(frontend)!: replace inventory.html with /?view=inventory (set analysis dropped)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:30:59 +02:00
Erik
559fd6596a feat(frontend): inventory item detail panel
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:26:55 +02:00
Erik
4735aa72e9 feat(frontend): inventory chips row + results table (sort, columns, paging, keyboard)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:26:38 +02:00
Erik
0533e2b9ee feat(frontend): inventory filter sidebar (characters, type, slots, cantrips, ratings, sets, state, reqs)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:22:10 +02:00
Erik
9a9b33a528 feat(frontend): /?view=inventory route + inventory page scaffold + dark CSS
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:16:12 +02:00
Erik
6fd87a3751 feat(frontend): useInventorySearch hook (debounced abortable search, URL state)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:09:47 +02:00
Erik
5ddcecaece feat(frontend): inventory search types + filter/column constants
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 06:09:22 +02:00
Erik
93982ac3dd docs(plan): inventory search redesign implementation plan
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:06:41 +02:00
Erik
edf76f50db docs(spec): inventory search redesign — React full-page view + approved mockup
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 05:57:10 +02:00
Erik
7096f30566 feat(inventory-go): wire spell filters into /search/items; harden empty-input guards
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 23:53:38 +02:00
Erik
4edf94f416 feat(inventory-go): build EXISTS conditions for spell filter params
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 23:44:51 +02:00
Erik
b0a6b494bf feat(inventory-go): spell name -> ID matchers for search spell filters
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 23:37:28 +02:00
Erik
bd9c1ba556 docs(plan): inventory spell filters implementation plan; spec: reuse existing slots UI
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:32:53 +02:00
Erik
aa3139b586 docs(spec): inventory search spell filters + jewelry-type selection
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:26:29 +02:00
Erik
5f7b4dcd55 fix(tracker-go): key login rate limiter on X-Real-IP, not spoofable XFF
nginx's X-Forwarded-For is $proxy_add_x_forwarded_for, which only appends
to whatever the client sends — a forged leftmost hop passed straight
through, letting an attacker rotate spoofed values to dodge the 5s login
cooldown. X-Real-IP is set by nginx to $remote_addr on every proxied
location and can't be forged by the client, so key on that instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 22:43:43 +02:00
Erik
db534ea389 fix(inventory-go): restore GET /inventory/{name} (live Inv window was empty)
The Go cutover omitted get_character_inventory; the React InventoryWindow
fetches GET /inventory/{name} and got 404 -> empty. Port the endpoint:
per-character items with placement (current_wielded_location/container_id/
items_capacity), mana (current_mana/max_mana from original_json IntValues),
icon overlays, and join-table combat/req/enh/rating stats; material-prefixed
name. Returns {character_name,item_count,items}.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:44:16 +02:00
Erik
4bc51a1f48 feat(suitbuilder): Select All / Clear All toggle for Legendary Wards
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:24:52 +02:00
Erik
09bde83325 feat(suitbuilder): CD0/CD1/CD2 allowed-tier checkboxes (replace dead crit min/max)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:36:45 +02:00
Erik
75a735d589 feat(suitbuilder): apply CD-tier filter in loadItems (before domination)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:35:20 +02:00
Erik
7155055072 feat(suitbuilder): CD-tier filter helpers + tests; gate inventory-go build on go test
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:35:20 +02:00
Erik
593e99894f feat(suitbuilder): add allowed_crit_damage constraint field
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:35:20 +02:00
Erik
dfdfd41882 docs: implementation plan for suitbuilder CD-tier filter
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:30:26 +02:00
Erik
f7fd6415a9 docs: design for suitbuilder CD-tier filter (CD0/CD1/CD2 toggles)
Per-search filter selecting which crit-damage tiers are allowed on armor.
Default (all allowed) is byte-identical to current behavior; "prefer highest
allowed tier" falls out of existing scoring. Go-only (live solver); Python
copy left frozen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:14:54 +02:00
Erik
9911edbfa8 docs: Go is production — rewrite README, update CLAUDE.md, gitignore .env
- README: Go-backend architecture, build/run via the compose override stack,
  WS/payload/auth/DB contracts, the branch layout (master = Go, python-legacy).
- CLAUDE.md: Project Overview + Components reflect the Go services; a "Go services
  — build, deploy, gotchas" section (string coercion, typeless telemetry, the
  trinket dedup, rollback); Deploying + Suitbuilder point at the Go paths. The
  behavioral contracts (WS/auth/DB/routes) are kept — Go honors them; file refs to
  main.py/inventory-service mark the legacy source.
- .gitignore: ignore .env / .env.bak-* (public repo; .env.example stays tracked).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 19:46:50 +02:00