Commit graph

3 commits

Author SHA1 Message Date
71071cff94 chore: one-command static deploy
The homelab has no rsync, so the tree goes over as a tar stream, and the
destination is wiped first - a stale content-hashed chunk left behind would be
served forever, since /assets/* is cached as immutable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 12:43:28 +03:00
96f273ce2b fix: reachable undo, nameable groups, and no favicon request
Found by running the app in a browser for the first time.

- Undo was only reachable from the team tab, and only after a team solve had
  finished, so an equip made from the character view had no way back. Both
  views now show it whenever there is something to undo.
- The owner-group naming dropdown listed all 23 espers from the game database
  rather than the characters the capture says you own. Two espers are both
  published as "Zero", so the list held two identical entries and picking the
  wrong one misattributed a whole loadout; conversely a character the game
  database has never heard of had no entry at all and its group could not be
  named. Options now come from the captured roster, labelled with the esper
  name and disambiguated by codename when two owned characters share one.
- An inline SVG favicon, so the page stops requesting one that does not exist.
  Inline rather than a file because the single-file build must make no
  requests at all.

Verified headless against the real 819-item export: import writes 819 items,
20 characters and 99 equipment rows to IndexedDB; a solve runs in a real
Worker and scores 0.6690 for Zankou, matching the Node bench; equip writes 8
app rows and displaces 7; undo restores all 99 imported rows; state survives
a reload. The file:// build renders, imports, solves inline and issues no
network request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 12:30:56 +03:00
5ce255fa6f feat: NTE gear optimizer web app
Client-side optimizer for Neverness to Everness console builds. Imports a
gear export from nte-history-exporter, keeps it in IndexedDB, and solves for
the best module placement per character or across a team.

- domain/: pure ports of the Python research scripts (shapes, cartridges,
  board tiling, stats, scoring, set bonuses, Arc effects, sheet prediction).
  No DOM, no storage imports, so they stay worker-safe and Node-testable.
- solver/: single-character solve with branch and bound, plus a three-phase
  team solve (portfolio, leximin, column generation) over disjoint item sets.
  Runs in a Worker when one can be constructed, inline otherwise.
- db/: three storage tiers selected by use rather than feature detection,
  fail-closed import validation, and undo that restores both sides of a steal.
- ui/: React 19 views for items, characters and teams; the board is drawn as
  the deliverable rather than a score.
- Two build targets: a hosted bundle and a single self-contained nte.html
  with no external requests.

Values the model cannot measure are reported as unavailable rather than
guessed: cartridge set bonuses, the level 80 base-stat multiplier, and the
distinction between "optimal for this packing" and globally optimal.

145 tests, tsc clean, both build targets clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 11:38:17 +03:00