From 9d5a9746497795d6f78c77edad9dbeebaba563a7 Mon Sep 17 00:00:00 2001 From: grom Date: Thu, 29 Oct 2026 11:55:05 -0600 Subject: [PATCH] Say out loud that GetAuctionSellItemInfo answers more than 1.12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The shape gate caught the extra two returns, which is exactly its job. They are not a gap to close, so they do not belong on NOT_YET_ASSERTED, which is a list of things that are wrong and may only shrink. BEYOND_1_12_ARITY is the other category: a binding that answers more because the realm's own FrameXML reads more, named with the reference's arity, ours, and the reason. The gate asserts both numbers, so an entry cannot drift — a stale reference arity fails, and so does a different count than the one the reason covers. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn --- .../benilla-app/src/ui_script/shape_gate.rs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/crates/benilla-app/src/ui_script/shape_gate.rs b/crates/benilla-app/src/ui_script/shape_gate.rs index c21f56ec..19e8d6f0 100644 --- a/crates/benilla-app/src/ui_script/shape_gate.rs +++ b/crates/benilla-app/src/ui_script/shape_gate.rs @@ -11,6 +11,22 @@ /// list may only shrink. const NOT_YET_ASSERTED: &[(&str, usize, &str)] = &[]; +/// Globals that answer **more** than 1.12 because the realm's own FrameXML reads more: a name, +/// the reference's arity, what this client answers, and why. +/// +/// A different thing from [`NOT_YET_ASSERTED`], which is a gap to close. These are deliberate and +/// load-bearing — the realm's interface does not work without them — so they are stated rather +/// than fixed, and the extra returns must come *after* the reference's, never in place of one. +/// The gate still fails on any other arity, including a larger one than the row claims. +const BEYOND_1_12_ARITY: &[(&str, usize, usize, &str)] = &[( + "GetAuctionSellItemInfo", + 6, + 8, + "the realm's rewritten CalculateAuctionDeposit reads maxStack as the 7th return \ + (Blizzard_AuctionUI.lua:1123); a nil there raises out of AuctionFrameAuctions_OnLoad and \ + the whole auction window fails to load. The 8th is the item link.", +)]; + /// The kind gate's list, same rules: a name, the wrong kinds it answers and the reason. An entry /// whose binding comes into agreement fails the gate. const KINDS_NOT_YET_ASSERTED: &[(&str, &str, &str)] = &[]; @@ -143,6 +159,21 @@ fn every_query_binding_answers_the_reference_s_return_arity() { } checked += 1; if got as usize != want { + if let Some((_, ref_arity, ours, _)) = + BEYOND_1_12_ARITY.iter().find(|(n, ..)| n == name) + { + assert_eq!( + *ref_arity, want, + "{name} is on the beyond-1.12 list against a stale reference arity — the \ + table now says {want}" + ); + assert_eq!( + got as usize, *ours, + "{name} is allowed {ours} returns for a named reason; it now answers {got}, \ + which is a different deviation and wants its own entry" + ); + continue; + } if let Some((_, known, _)) = NOT_YET_ASSERTED.iter().find(|(n, ..)| n == name) { assert_eq!( *known, want,