dev #24

Merged
yami merged 7 commits from dev into main 2026-08-11 19:38:48 -04:00
Owner
No description provided.
Frontend for the Optimize endpoint. Adds to the roadmap page:

  * floor toggles — which savage floors the static can reclear each week,
    the single biggest input to the estimate since book income is per-floor;
  * two week counts, at today's floors and with all four open, so the cost of
    progression is visible without anyone predicting when the next floor dies;
  * a per-player book breakdown, with unreachable floors called out in amber
    rather than folded into a number;
  * proposed queue changes, diffed against what is actually on screen.

Deliberately a preview. Apply writes through setOverride one queue at a time,
exactly as a manual drag would, so an optimizer run has no privileged write
path and cannot silently replace an order the static argued over. Nothing is
applied until pressed, and queues that already match are not listed.

The estimate is labelled books-only in the UI, because that is what it is:
every clear banks one book per floor, so it is a ceiling that chest drops
improve on. Presenting it as a schedule would be a lie about randomness.

Floor toggles are offered to any claimed member and enforced Lead-side by the
server, which rolls the toggles back and explains if refused. The client has
no role information here, and guessing would wrongly lock out an actual lead.
Changing floors re-runs an open plan, since a stale panel would now be
describing a different set of floors than the toggles show.

Verified against a local stack: Optimize returns a plan whose arithmetic
checks by hand (a player owing a 6-book body plus a 3-book accessory finishes
week 4 — accessory week 2 via converted floor-4 books, body week 4), the
makespan ordering holds, and locking M3 flips weeksAtCurrentFloors to null
with Body marked unreachable on both the queue and the affected players.
Matches the backend wording change. The toggles record what the static
actually clears, not what it is capable of clearing — a book requires the
clear, so unticking a floor forfeits its books along with its chests.

Adds a line under the toggles saying so, because the failure mode is a lead
unticking a farm floor they still clear on the assumption it only affects
chest estimates, and quietly getting a worse plan.
feat(roadmap): show per-floor "is this still worth clearing?"
All checks were successful
Docker Build & Push / build-and-push (push) Successful in 39s
4800b5d21a
Surfaces the backend's skippable-floor verdict in the Optimize panel, as
three visually distinct cases rather than a single flag:

  * safe to skip — nobody needs the gear or the books, so clearing earns
    nothing;
  * keep clearing — with the count of players and books still outstanding;
  * not cleared but needed — the worst combination, called out in amber.

Floor 4 gets its own wording when it has no weapons outstanding: "its books
convert into the other floors, so skipping it would slow everyone still
missing something". Without that, the panel would show a floor with zero
demand next to a "keep clearing" verdict and look simply wrong.

Phrasing lives here rather than on the server, which returns facts
(outstandingBooks, playersNeeding, convertsToOtherFloors) — but the
conversion rule is not re-derived client-side, it is a field, so the two
cannot disagree about why a floor is worth clearing.
feat(roadmap): enter and display current book balances
All checks were successful
Docker Build & Push / build-and-push (push) Successful in 39s
7e4ea856ce
Adds a per-player, per-floor grid to the Optimize panel, feeding the
balances the backend now seeds the simulation from.

Staleness is the known weakness of hand-entered data, so it is surfaced
rather than hidden. The panel shows how old the numbers are, and past a week
— the point at which every cleared floor has added a book — it says so
explicitly and estimates by how much the plan is now reading pessimistic.
Saving re-stamps the date even when nothing changed, so the button reads
"Re-confirm" for unchanged input: confirming a balance is still true is the
useful action, not just editing it.

Placed above the week counts because it is an input to them, and an empty
grid says outright that the estimate assumes zero and is therefore a worst
case. Saving re-runs an open plan, since leaving a stale estimate beside
freshly-typed inputs would show numbers that no longer match.

Alts are omitted: the optimizer excludes them from the timeline, so asking
anyone to maintain their counts would be busywork. In-progress edits are not
clobbered by a realtime roadmap refresh.

Verified end to end against a local stack: a player owing one body piece
reports 3 weeks with nothing entered, 1 week after saving 4 floor-3 books,
and 0 weeks at 6 — the last being correct, since at that point they are
waiting on a vendor trip rather than a clear.
feat(roadmap): distinguish plugin-synced book counts from typed ones
All checks were successful
Docker Build & Push / build-and-push (push) Successful in 38s
88bb70b32e
Shows which rows the plugin maintains, so nobody wastes effort keeping a
number current that updates itself.

Plugin-backed rows are excluded from the staleness warning. Only typed
figures drift; a plugin row is either current or the player simply has not
logged in, and warning about that would train people to ignore the warning
that does matter.

Saving no longer rewrites every cell. It sends non-plugin rows plus any
plugin cell the user deliberately typed over — blanket-sending the grid meant
one person re-confirming their own numbers would flip the whole roster to
Manual and quietly disable everyone else's automatic sync. Typing over a
plugin row still hands it back to manual on purpose, which the help text now
says.
feat: added view into who is available when when hovering over a timeslot
All checks were successful
Docker Build & Push / build-and-push (push) Successful in 40s
25d8793e1f
chore(roadmap): hide the unfinished optimize panel
All checks were successful
Docker Build & Push / build-and-push (push) Successful in 40s
61fa318bc5
The optimizer is not complete, so gate OptimizePanel behind a
SHOW_OPTIMIZE_PANEL constant that is currently false. The component,
props and handlers stay wired up; flipping the flag brings it back.
yami merged commit 4a0851ed77 into main 2026-08-11 19:38:48 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
yami/xivloot-rewrite!24
No description provided.