From 2a9507cb6a0d97fcdf6feddae5a759aebedd074e Mon Sep 17 00:00:00 2001 From: funman300 Date: Sat, 22 Aug 2026 16:56:01 +0000 Subject: [PATCH] docs(re): consumable quick-sell is PUT item/resource, live-captured --- fifa17-recon/docs/CLIENT_ROUTE_SURFACE.md | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/fifa17-recon/docs/CLIENT_ROUTE_SURFACE.md b/fifa17-recon/docs/CLIENT_ROUTE_SURFACE.md index 1ebe243..48ee3de 100644 --- a/fifa17-recon/docs/CLIENT_ROUTE_SURFACE.md +++ b/fifa17-recon/docs/CLIENT_ROUTE_SURFACE.md @@ -361,3 +361,46 @@ it becomes an explicit design decision. Status: **EFFECT_UNKNOWN**. | batching | UNPROVEN — refused, never guessed | | contract effect / grant size | UNKNOWN (placeholder source refuted) | | source instance selection with multiple copies | UNDETERMINED (only 1 copy owned) | + +## Consumable QUICK-SELL is PUT item/resource — LIVE_PROVEN (2026-08-22) + +Captured on staging when the operator quick-sold a Position Modifier from the +consumables screen: + +``` +PUT /ut/game/fifa17/item/resource/5003068 body_len=0 +``` + +So `ut//item/resource/` carries THREE verbs, and this is the +third: + +| verb | meaning | +|---|---| +| `GET` | item-definition lookup (`defs_route` parity) | +| `POST` | apply the consumable (`ApplyCardByRes`, body `{"apply":[{"id":N}]}`) | +| `PUT` | **quick-sell the consumable**, EMPTY body | + +Note it is keyed by **resourceId**, i.e. the STACK, not by an owned instance +id — unlike the player quick-sell, which is `DELETE ut//item/` +and is retail-proven in production. That asymmetry follows the consumables +screen's own model: the UI entity there is a stack, not a card. + +Neither stack has ever served this route. The Python oracle maps +`item/resource` method-agnostically to `defs_route`, so a PUT would get a +definition list and HTTP 200 while nothing was sold — the client would believe +the sale succeeded. On staging the oracle is deliberately dead, so it 502'd and +Core was left untouched (coins 29843976, owned 1993, consumables 17). + +### Consequence for production + +Production's oracle IS alive, so today a consumable quick-sell there would reach +Python, return 200 from `defs_route`, and mutate nothing — the client would show +a successful sale that never happened. That is a second, independent reason not +to quick-sell consumables in production until this route is implemented in Rust. + +### UNKNOWN, not to be guessed + +* Does an empty-body PUT sell ONE copy or the WHOLE stack? The request carries no + quantity, and both readings fit. A stack of 2 at 38 is either +38 or +76. +* Which owned instance is consumed when several share the resourceId. +* What response the client requires (the player path's ack shape may not apply).