acdream/docs/research/2026-08-26-combined-client-parity-gate.md
Erik f6fe0f2a4f
All checks were successful
CI / linux-portable (push) Successful in 3m27s
CI / windows-gate (push) Successful in 6m42s
CI / release (push) Successful in 2m12s
fix(client): restore retail interaction parity
Harden keyboard and camera routing, inventory and vendor interactions, chat/emotes, relog portal flow, and paperdoll rendering. Add retail research, connected gate coverage, and release-gate validation.
2026-08-26 20:45:11 +02:00

7.3 KiB
Raw Blame History

Combined client parity owner gate

Date prepared: 2026-08-26

Run: OWNER-COMPLETE 2026-08-26 on one exact Release binary.

Scope: #443#450 plus the complete inventory/vendor interaction audit.

Outcome: Sections AC and EF passed, including the mid-drag cursor-icon re-test added during the round. Issues #444#450 are owner-accepted. Section D failed: the private paperdoll remained missing, so #443 stays open as the only surviving defect. Tested executable SHA-256: 173989F3C85C05C0746D628CDF9C6194F6A5E3EFD4597806BF83417483C37B42.

Keep the client log for the whole run and take a screenshot for any visual or text mismatch. For every refused item action, record the cursor color, exact SpewBox line, and whether the item visibly moved before the refusal.

A. Keyboard, camera, combat input, and relog — #446/#450

  1. In Configure Keyboard, bind Move Forward to bare Shift while Toggle Walk/Run already owns it. Verify the retail conflict dialog appears and the chosen resolution is honored. Repeat with a known allowed shared chord.
  2. Apply a changed binding, close/reopen Options, then restart the client. Verify it survives. Test Revert, Defaults, Cancel, and Load/Save .keymap.
  3. Press regular Enter: chat input must focus. Press keypad Enter outside chat: it must perform only its configured camera action and must not focus chat.
  4. Press bare Escape through the retail ladder: cancel target/focus/selection first, then toggle Gameplay Options. It must never enter a developer orbit or bird's-eye mode. Preserve the approved mouse-wheel zoom range.
  5. Hold End, Page Down, or Delete in melee mode. The bar must charge while the key is held and attack only on release, using the selected height.
  6. Shift+Escape to character selection, immediately re-enter, and verify the destination loads and exits portal space. Repeat twice in one process.

B. Chat and combat text — #447/#448

  1. Run @acecommands. Every non-empty server line must be visible; an oversized response must retain the newest complete lines, not blank the transcript.
  2. Run @acehelp acecommands and send ordinary chat afterward. Verify normal text, filtering, and scrolling remain intact.
  3. Land ordinary and critical melee hits. Outgoing lines must match retail wording and punctuation and contain no acdream-added percentage.

C. Selection, use, containers, movement, and splitting — #445/#449

Use a normal item, unusable item, wearable, weapon, two mergeable stacks, a Pyreal stack, one side pack, a full main pack, a full side pack, an open external container, and a creature/player target.

  1. Single-click and right-click inventory, side-pack, external-container, and paperdoll items. Verify one global selection, stable highlight, status text, and right-click examination.
  2. Select an owned Pyreal stack. The toolbar must read <stack> <appropriate name> (of <total carried Pyreals>), with no comma insertion added by acdream.
  3. Single- and double-click a carried side pack. It must open on press, issue no generic item-use request, and remain stably selected.
  4. Double-click usable, unusable, wearable, and wieldable items. Verify one action. Any local refusal must appear once in SpewBox, not in normal chat.
  5. Move a full item between main pack and side pack. Before acknowledgement, the source must remain canonical with retail's waiting/ghost presentation; after success it appears only at the destination. Force one rejection and verify no duplicate, disappearance, or speculative capacity change. While holding the item under the cursor, move across the inventory and wait through several ordinary object updates: the cursor icon must remain visible until release. This re-gates the mid-drag procedural-refresh fix found during the first 2026-08-26 owner pass.
  6. Fill the main pack, observe a rejected move, drop one loose item, then move an item from a side pack into the freed slot immediately. It must accept without reopening the inventory window (#449).
  7. From a stack of 10, select 2 and split into an empty main-pack slot, an open side pack, and an external container. Each successful result must be 8+2.
  8. Merge full and partial stacks. Verify selected quantity, target selection, target-cap clamp, source remainder, and exact refusal text for a full target.
  9. Drop full and partial stacks to the world, then pick them up. Verify pending visuals, authoritative commit, failure cleanup, and no duplicate object.
  10. Give a full and partial stack to a creature; drag onto another player and verify secure-trade routing. Hover rejection must stay silent; release rejection must print the exact ClientLocal reason.
  11. Equip once by double-click and once by paperdoll drag. Test a clothing conflict and weapon replacement. Canonical inventory/paperdoll ownership must not change before the authoritative response.

D. Private paperdoll viewport — #443

  1. From a fresh process, open inventory and assess one monster and one player.
  2. The animated doll must be present on first open, not appear only after a delay. Close/reopen each view several times and change equipment once.
  3. Record #443 independently if the viewport is late or missing even when the underlying equip/inventory transaction is correct.

E. Vendor parity and alternate currency — #444/#445

  1. On the browse list, single-click selects, right-click examines, and double-click buys exactly one/current-slider unit through the normal retail purchase path.
  2. Add a stack quantity greater than one to Buying. Double-click its staged row: remove exactly one unit and print Removing <name> from shopping list once in SpewBox.
  3. Stage an owned item in Selling. Right-click examines it; double-click removes the whole staged entry and prints the same removal form.
  4. Drag a staged Selling row: it must unstage. Repeat after selecting only part of its stack: SpewBox must print You cannot split items from this panel and the slider must reset to max.
  5. From an owned stack of 10, select 2 and drag into Selling. Verify the temporary row resolves to the new authoritative stack of 2, Sell All sells exactly 2, and 8 remain (#445).
  6. At an alternate-currency vendor, note holdings in the Items cost sentence and Buying/Selling purse lines. Buy once: every visible holding must decrease immediately and remain correct after authoritative inventory refresh, tab changes, and vendor reopen (#444).
  7. Buy All once with enough currency and once without enough. The first uses the refreshed balance; the second prints retail's insufficient-funds notice and sends no purchase.

F. Re-entrant and lifecycle stress

  1. Change selection during a pending split, close an external container during a pending move, and retry immediately after a refusal.
  2. Attempt a second inventory operation while one request is pending. Verify a clean retail refusal/no-op, never duplicated wire action or stuck busy state.
  3. Log out or portal with a recently completed interaction, re-enter, and verify pending projections and the request ledger converge to zero.

Pass rule

The pass rule was satisfied for #444#450 on the exact binary recorded above. #443 remains open by itself because the transaction rows passed and the failure was confined to private viewport residency.