Repository navigation
Conversation
The module tagged auction refusals as bracketed strings and the gateway matched substrings of rendered error text. A reducer timeout or any unrelated failure fell through that match and reached the client as a gameplay refusal. One shared AuctionRefusal enum now crosses the reducer edge as a tag. The module's listing and bid cores return it directly; the gateway classifies on ReducerCallError first and parses the tag only from a rejected reducer, so a timeout ends the session instead of posing as a refusal. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #409 (
fix/auction-release-listing-hold). Merge that first; this PR's base is that branch.The Module refuses an Auction Durable Request with a
Result<(), String>, because SpacetimeDB reducers return strings. The Module tagged those strings as[AUCTION_DATABASE] detailand the Gateway searched the rendered error text for the tag. Any failure without a tag, including a 10 second reducer timeout, fell through that search and reached the client as a gameplay refusal.One shared
AuctionRefusalenum inlyracore-sharednow defines the contract. Each variant has a stable tag (auction:item_not_found,auction:not_enough_money,auction:invalid_terms,auction:database) withas_tagandparse_tag. The Module listing and bid cores return the enum; the reducer edge sends only the tag and keeps the human detail in the Module log. The Gateway checksReducerCallErrorfirst and parses the tag only from a reducer the Module rejected. A timeout, transport failure, or SDK failure stays an error with an unknown outcome and ends the session, the same as the loot handler. Every substring match on auction text is gone, including the handler text classifier.Client mapping:
ItemNotFoundbecomesErrItemNotFound,NotEnoughMoneybecomesErrNotEnoughMoney, andInvalidTermsplusDatabasebecomeErrDatabasebecause the vanilla client has no invalid-terms result. The same mapping servesStartedandBidPlaced.The reviewed Realm-core refund protocol from #409 is merged into this branch without rewriting history. Its zero-id refund receipt is also represented as
InvalidTermsat the reducer edge and cannot become a successful Auction replay.Verification:
This shape is the template for social, trainer, and item refusals.
Written by Claude Fable 5.1 through Claude Code. Review fixes by GPT-5.6 through the Codex harness in T3 Code.