market: promote forSale — live-confirmed on the expired path
Operator drove the expired row 1000000155 (res 158023, 93 RW) in FIFA 17 with the candidate deployed: the row was still actionable, Return to Club was offered, and it worked — "the card is back in my club". Server-verified durable afterwards, which is what a fresh session reconstructs: /tradePile total 0 with zero rows, /tradePile/counts all zero, the card present in /club (1965 -> 1966 items, itemState "free"), zero duplicate ids, no stale active listing anywhere in the store (both rows cancelled), and the ended auction projecting as `closed` (4) on /trade/status. Fix A intact: zero `inactive` rows. So `listFS` -> `forSale` is protocol-correct AND behaviour-preserving on the path that matters, and `listFS` is gone from production serialization. Also worth recording what the result rules out: CARD_OFFERSTATE is NOT a gate term that requires -1. Every actionable row we had ever seen carried itemState -1, which looked like a possible client rule; it was a coincidence of our own invalid token. An expired row decoding CARD_OFFERSTATE = 5 stayed actionable. Deliberately NOT claimed: anything about the Flash action gate itself. STATE and the RESERVEDPRICE/MAX_CREDITS pair are untouched and still confounded, so the gate remains Category C / STRONGLY SUPPORTED / not proven, and AVM1 disassembly of tradepile.isInActiveAuction is still the separate next investigation. One gap left open honestly: no ACTIVE seller row existed during the session, so active-row rendering under `forSale` is unverified. /transfermarket has always emitted `forSale` on active rows, so it is expected-safe, but it has not been seen.
This commit is contained in:
@@ -642,16 +642,25 @@ live on our listed row. FIFA 17's value for a listed item is `forSale` (5), from
|
||||
so does the Python oracle (`utas_server.py:3921`) — which is exactly why the
|
||||
differential never caught it: **oracle parity is necessary but not sufficient.**
|
||||
|
||||
### Fix B — `forSale` CANDIDATE DEPLOYED, live A/B outstanding (2026-08-17)
|
||||
### Fix B — `forSale` PROMOTED, live-confirmed on the expired path (2026-08-17)
|
||||
|
||||
Shipped as a code+deploy change, deliberately alone, and **not yet live-confirmed**.
|
||||
Shipped alone, then validated by an operator FIFA 17 session against the already-expired
|
||||
row `1000000155` (res 158023, 93 RW).
|
||||
|
||||
| Claim | Status |
|
||||
|---|---|
|
||||
| `listFS` is not a FIFA 17 token and decodes to −1 | **CONFIRMED** (binary + 4.26 GiB process scan + live row) |
|
||||
| `forSale` is FIFA 17-native, value 5 | **CONFIRMED** (12-row table at `0x180229cc0`) |
|
||||
| Emitting `forSale` preserves the list → expire → Return-to-Club lifecycle | **NOT YET OBSERVED** — needs an operator FIFA 17 session |
|
||||
| `CARD_OFFERSTATE` is the Flash action-gate term | **STILL UNPROVEN** — this change does not test it |
|
||||
| An expired row carrying `forSale` is still ACTIONABLE, and Return to Club works | **LIVE-CONFIRMED** — operator returned the card; server verified below |
|
||||
| The result is durable (a fresh session reconstructs it) | **CONFIRMED server-side**: `/tradePile` `total:0`, `/tradePile/counts` all zero, card present in `/club` (1965 → 1966 items, `itemState:"free"`), zero duplicate ids, listing `cancelled` in the store and projected as `closed` (4) on `/trade/status` |
|
||||
| An ACTIVE seller row carrying `forSale` renders correctly | **NOT YET OBSERVED** — no active listing existed during the session; `/transfermarket` has always emitted `forSale` on active rows, so this is expected-safe but unverified |
|
||||
| `CARD_OFFERSTATE` is the Flash action-gate term | **STILL UNPROVEN** — this change does not test it, and the result does not bear on it |
|
||||
|
||||
What this rules out: `CARD_OFFERSTATE` is not a gate term that *requires* −1. An expired
|
||||
row decoding `CARD_OFFERSTATE = 5` remained actionable, so the earlier worry — that every
|
||||
actionable row we had ever seen carried `itemState = −1` — was a coincidence of our own
|
||||
bad token, not a client rule. It narrows nothing else: `STATE` and the
|
||||
`RESERVEDPRICE`/`MAX_CREDITS` pair are untouched and still confounded with each other.
|
||||
|
||||
Wire A/B (`docs/evidence/market-lifecycle-2026-08-17/itemstate-forsale-ab.json`): on the
|
||||
same expired row, **exactly one field changed** — `itemState` `listFS` → `forSale`.
|
||||
|
||||
@@ -68,8 +68,43 @@
|
||||
"clippy": "clean",
|
||||
"differential": "relabelled market-query tradePile PARITY -> DIFFERENT-BY-DESIGN; now pins oracle=listFS and rust=forSale so the divergence stays visible"
|
||||
},
|
||||
"status": "CANDIDATE DEPLOYED to prod-host, awaiting the live lifecycle A/B",
|
||||
"live_status": "NOT YET OBSERVED \u2014 requires an operator FIFA 17 session",
|
||||
"status": "PROMOTED \u2014 live-confirmed on the expired path",
|
||||
"live_status": {
|
||||
"session": "operator FIFA 17 session, 2026-08-17, against the already-expired row 1000000155 (res 158023, 93 RW)",
|
||||
"expired_row_actionable": true,
|
||||
"return_to_club_offered": true,
|
||||
"return_to_club_succeeded": true,
|
||||
"operator_report": "the card is back in my club",
|
||||
"server_verified_after": {
|
||||
"tradePile_total": 0,
|
||||
"tradePile_rows": 0,
|
||||
"tradePile_counts": {
|
||||
"count": 0,
|
||||
"maxAuctionsAllowed": 100,
|
||||
"offered": 0,
|
||||
"selling": 0,
|
||||
"sold": 0
|
||||
},
|
||||
"trade_status_1000000155": "closed",
|
||||
"market_store_state": "cancelled",
|
||||
"club_items": 1966,
|
||||
"club_items_before": 1965,
|
||||
"card_in_club": {
|
||||
"id": 100000155,
|
||||
"resourceId": 158023,
|
||||
"rating": 93,
|
||||
"preferredPosition": "RW",
|
||||
"itemState": "free",
|
||||
"untradeable": false
|
||||
},
|
||||
"duplicate_ids_in_club": 0,
|
||||
"stale_active_listings": 0,
|
||||
"inactive_rows": 0
|
||||
},
|
||||
"active_row_render_with_forSale": "NOT OBSERVED \u2014 no active listing existed during the session",
|
||||
"full_exit_reentry_ui": "NOT DIRECTLY OBSERVED \u2014 durability established from the server state a fresh session reads (empty tradePile + card in club)"
|
||||
},
|
||||
"revert": "single-line: set both auction_record_as(l, \"forSale\") calls in market.rs back to \"listFS\", rebuild, hub restart prod-host",
|
||||
"claim_boundary": "This validates PROTOCOL CORRECTNESS of the token only. It does NOT prove the Flash action-gate term; STATE / CARD_OFFERSTATE / RESERVEDPRICE+MAX_CREDITS remain confounded and the gate stays Category C / STRONGLY SUPPORTED / not proven."
|
||||
"claim_boundary": "This validates PROTOCOL CORRECTNESS of the token only. It does NOT prove the Flash action-gate term; STATE / CARD_OFFERSTATE / RESERVEDPRICE+MAX_CREDITS remain confounded and the gate stays Category C / STRONGLY SUPPORTED / not proven.",
|
||||
"narrows": "CARD_OFFERSTATE is not a gate term requiring -1: an expired row decoding 5 stayed actionable. STATE and RESERVEDPRICE/MAX_CREDITS remain confounded; the Flash gate is still Category C / not proven."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user