From 0f15c741472833bec5d58e74df9aaa98218807c4 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 14 Aug 2026 12:48:31 +0200 Subject: [PATCH] chore: secure-trade closeout - strip [trade] gate probes, roadmap ledger The two-client user gate PASSED 2026-08-14 (open both ways, stage with the retail trading marker, accept/decline, executed swap, Clear All, cancel text). Every TEMPORARY [trade] probe line from gate rounds 1-2 is stripped (ItemInteractionController, SelectionInteractionController, SecureTradeUiController, LiveSessionCommandRouter, WorldSession, RuntimeTradeState). Roadmap gains the shipped-trade ledger row. Suites after strip: App 4,992/3, Runtime 1,626 - green. Co-Authored-By: Claude Fable 5 --- docs/plans/2026-04-11-roadmap.md | 1 + .../Interaction/SelectionInteractionController.cs | 3 --- src/AcDream.App/Net/LiveSessionCommandRouter.cs | 10 ++-------- src/AcDream.App/UI/ItemInteractionController.cs | 12 ------------ src/AcDream.App/UI/Layout/SecureTradeUiController.cs | 4 ---- src/AcDream.Core.Net/WorldSession.cs | 2 -- src/AcDream.Runtime/Gameplay/RuntimeTradeState.cs | 4 ---- 7 files changed, 3 insertions(+), 33 deletions(-) diff --git a/docs/plans/2026-04-11-roadmap.md b/docs/plans/2026-04-11-roadmap.md index 7b0d552f..c4fd0cf9 100644 --- a/docs/plans/2026-04-11-roadmap.md +++ b/docs/plans/2026-04-11-roadmap.md @@ -2101,6 +2101,7 @@ OpenGL ceiling; revisit macOS only if a supported graphics backend is chosen. | Can't fight monsters | **M2 LANDED 2026-07-15** ✓ — melee/missile, death, loot, inventory loop user-gated | | Can't cast spells | **M3 connected single-client casting/effects gate passed** ✓; final two-client portal observer gate remains | | No inventory panel | **D.5 / M2 SHIPPED + user-gated** ✓ — bags, stacks, paperdoll, equipment, drag/drop, loot | +| No player-to-player trading | **Secure trade SHIPPED + two-client user gate PASSED 2026-08-14** ✓ — gmSecureTradeUI window (LayoutDesc 0x2100000D), full 0x1F6–0x208 wire, both retail open paths (Use-on-player, drag-item-onto-player option), staged-item trading marker, cancel text; research `docs/research/2026-08-14-trade-lane{A,B,C}-*.md`, memory `project_secure_trade.md` | | No character creation — must use ACE admin | **Phase H.4** | | Sky is a flat color | **Phase G.1** (shipped; F7 cycles time, F10 cycles weather) | | Can't join allegiance | **Phase H.2** | diff --git a/src/AcDream.App/Interaction/SelectionInteractionController.cs b/src/AcDream.App/Interaction/SelectionInteractionController.cs index 4988a28a..27ef7851 100644 --- a/src/AcDream.App/Interaction/SelectionInteractionController.cs +++ b/src/AcDream.App/Interaction/SelectionInteractionController.cs @@ -99,9 +99,6 @@ internal sealed class SelectionInteractionController { ArgumentNullException.ThrowIfNull(payload); uint target = _query.PickAt(mouseX, mouseY, includeSelf: true) ?? 0u; - if (ItemInteractionController.PhysicsDiagnosticsTradeProbe) - Console.WriteLine( - $"[trade] drag-release item=0x{payload.ObjId:X8} pick=0x{target:X8}"); if (target != 0u) _query.BeginLightingPulse(target); _items.PlaceIn3D(payload, target); diff --git a/src/AcDream.App/Net/LiveSessionCommandRouter.cs b/src/AcDream.App/Net/LiveSessionCommandRouter.cs index 46b0e042..0b0b44d4 100644 --- a/src/AcDream.App/Net/LiveSessionCommandRouter.cs +++ b/src/AcDream.App/Net/LiveSessionCommandRouter.cs @@ -229,14 +229,8 @@ internal sealed class LiveSessionCommandRouter : ILiveSessionCommandRouting commands.Register( command => SendIfActive(() => bindings.AddFriend(command.Name))); commands.Register( - command => - { - bool sent = SendIfActive(() => - bindings.OpenTradeNegotiations(command.PartnerGuid)); - // TEMPORARY [trade] probe (2026-08-14 gate round 2). - Console.WriteLine( - $"[trade] open-cmd partner=0x{command.PartnerGuid:X8} sent={sent}"); - }); + command => SendIfActive(() => + bindings.OpenTradeNegotiations(command.PartnerGuid))); commands.Register( _ => SendIfActive(bindings.CloseTradeNegotiations)); commands.Register( diff --git a/src/AcDream.App/UI/ItemInteractionController.cs b/src/AcDream.App/UI/ItemInteractionController.cs index e9fd614a..5a327efb 100644 --- a/src/AcDream.App/UI/ItemInteractionController.cs +++ b/src/AcDream.App/UI/ItemInteractionController.cs @@ -1055,19 +1055,11 @@ public sealed class ItemInteractionController : IDisposable & PublicWeenieFlags.Player) == 0) return false; - if (PhysicsDiagnosticsTradeProbe) - Console.WriteLine( - $"[trade] use-on-player guid=0x{targetGuid:X8} " - + $"nonCombat={_inNonCombatMode()} subscribers={SecureTradeRequested is not null}"); if (_inNonCombatMode()) SecureTradeRequested?.Invoke(targetGuid, 0u); return true; } - /// TEMPORARY (2026-08-14 trade gate round 1): [trade] seam - /// probe lines, stripped once the two-client gate passes. - internal static bool PhysicsDiagnosticsTradeProbe = true; - public bool DropToWorld(ItemDragPayload payload) => PlaceIn3D(payload, targetGuid: 0u); @@ -1219,10 +1211,6 @@ public sealed class ItemInteractionController : IDisposable // (ItemHolder::AttemptPlaceIn3D @ 0x00588600's option branch // → ClientTradeSystem::AttemptToTradeItem @ 0x0056DF80). // ObjectId = the dragged item, TargetId = the player. - if (PhysicsDiagnosticsTradeProbe) - Console.WriteLine( - $"[trade] drag-on-player item=0x{action.ObjectId:X8} " - + $"target=0x{action.TargetId:X8} subscribers={SecureTradeRequested is not null}"); SecureTradeRequested?.Invoke(action.TargetId, action.ObjectId); break; case ItemPolicyActionKind.DropToWorld: diff --git a/src/AcDream.App/UI/Layout/SecureTradeUiController.cs b/src/AcDream.App/UI/Layout/SecureTradeUiController.cs index 793e0741..b03fc02b 100644 --- a/src/AcDream.App/UI/Layout/SecureTradeUiController.cs +++ b/src/AcDream.App/UI/Layout/SecureTradeUiController.cs @@ -189,10 +189,6 @@ public sealed class SecureTradeUiController : IRetainedPanelController public void RequestSecureTrade(uint partnerGuid, uint itemGuid) { if (_disposed || partnerGuid == 0u) return; - if (ItemInteractionController.PhysicsDiagnosticsTradeProbe) - Console.WriteLine( - $"[trade] request partner=0x{partnerGuid:X8} item=0x{itemGuid:X8} " - + $"open={_bindings.Trade.Snapshot.IsOpen}"); RuntimeTradeSnapshot snapshot = _bindings.Trade.Snapshot; if (snapshot.IsOpen && snapshot.PartnerGuid == partnerGuid) { diff --git a/src/AcDream.Core.Net/WorldSession.cs b/src/AcDream.Core.Net/WorldSession.cs index 6bbfcfb6..6833825b 100644 --- a/src/AcDream.Core.Net/WorldSession.cs +++ b/src/AcDream.Core.Net/WorldSession.cs @@ -2568,8 +2568,6 @@ public sealed class WorldSession : IDisposable public void SendOpenTradeNegotiations(uint partnerGuid) { uint seq = NextGameActionSequence(); - // TEMPORARY [trade] probe (2026-08-14 gate round 2). - Console.WriteLine($"[trade] wire-open partner=0x{partnerGuid:X8} seq={seq}"); SendGameAction(TradeRequests.BuildOpenTradeNegotiations(seq, partnerGuid)); } diff --git a/src/AcDream.Runtime/Gameplay/RuntimeTradeState.cs b/src/AcDream.Runtime/Gameplay/RuntimeTradeState.cs index 9164e03f..adf280a1 100644 --- a/src/AcDream.Runtime/Gameplay/RuntimeTradeState.cs +++ b/src/AcDream.Runtime/Gameplay/RuntimeTradeState.cs @@ -98,10 +98,6 @@ public sealed class RuntimeTradeState : IDisposable /// public void ApplyRegister(GameEvents.RegisterTrade update, uint selfGuid) { - // TEMPORARY [trade] probe (2026-08-14 gate round 2). - Console.WriteLine( - $"[trade] register initiator=0x{update.Initiator:X8} " - + $"partner=0x{update.Partner:X8} self=0x{selfGuid:X8}"); lock (_gate) { ObjectDisposedException.ThrowIf(_disposed, this);