diff --git a/docs/FIFA17_TRANSFER_MARKET_WIRE.md b/docs/FIFA17_TRANSFER_MARKET_WIRE.md index efc8728..a321a43 100644 --- a/docs/FIFA17_TRANSFER_MARKET_WIRE.md +++ b/docs/FIFA17_TRANSFER_MARKET_WIRE.md @@ -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`. diff --git a/docs/evidence/market-lifecycle-2026-08-17/itemstate-forsale-ab.json b/docs/evidence/market-lifecycle-2026-08-17/itemstate-forsale-ab.json index 7b7847b..7973bca 100644 --- a/docs/evidence/market-lifecycle-2026-08-17/itemstate-forsale-ab.json +++ b/docs/evidence/market-lifecycle-2026-08-17/itemstate-forsale-ab.json @@ -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." }