diff --git a/docs/FIFA17_TRANSFER_MARKET_WIRE.md b/docs/FIFA17_TRANSFER_MARKET_WIRE.md index c4e2244..ba5ba5a 100644 --- a/docs/FIFA17_TRANSFER_MARKET_WIRE.md +++ b/docs/FIFA17_TRANSFER_MARKET_WIRE.md @@ -652,7 +652,7 @@ row `1000000155` (res 158023, 93 RW). | `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`) | | 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` | +| The result is durable (a fresh session reconstructs it) | **LIVE-CONFIRMED** (Gap 2, 2026-08-17) — the operator exited FUT and re-entered; the host log shows `auth-delete` then two fresh `sid_opened=true` sessions, each re-fetching `/club` and `/tradePile`, and the card was still in My Club. 18/18 server checks passed identically before and after. See the Gap 2 closure section. | | An ACTIVE seller row carrying `forSale` renders correctly | **LIVE-CONFIRMED** (Gap 1, 2026-08-17) — see the closure section below; the client decoded `CARD_OFFERSTATE = 5` out of its own auction record | | `CARD_OFFERSTATE` is the Flash action-gate term | **STILL UNPROVEN** — this change does not test it, and the result does not bear on it | @@ -765,3 +765,123 @@ function object in the live process, or extract `external/ion_fut/screens/trading/tradepile` from `ui.sb` + the `cas` archives offline. Nothing else in reach separates `STATE` from `CARD_OFFERSTATE` from the price pair, because all three differ together in every observable row. + +--- + +## Gap 2 CLOSED — Return to Club survives a full exit/re-entry (2026-08-17) + +The claim the Fix B promotion could only make server-side. Closed on the same +disposable card as Gap 1 (75 ST, res `212188`, wire id `100000178`, tradeId +`1000000178`) after it expired **naturally** — the 1h auction was allowed to run +out. No timestamp was mutated at any point in either gap. + +### The whole lifecycle, observed rather than forced + +A read-only sampler polled `/tradePile` once a minute for the auction's full hour +(55 samples). `expires` is derived from `created_at + duration`, so watching is the +only honest way to see expiry happen: + +```text +t=1787012091 active expires 3175 itemState forSale + ... counting down, one sample a minute ... +t=1787015271 expired expires 0 itemState forSale <- natural expiry +t=1787015301 (absent) total 0 <- Return to Club +``` + +`itemState` stayed `forSale` across the `active -> expired` transition, which is the +Fix B behaviour under the one state change we had never watched live. + +### Return to Club, then two session boundaries + +The host log records the coupled transition and the re-entries: + +```text +route=move-items wire=100000178 pile=club auction_cancelled=1 +route=auth-delete +route=auth ... ip=10.10.0.105 persona=33068179 sid_opened=true +route=hub clubPlayers=1966 auctionCount=0 +route=club total=1986 emitted=1966 dropped_no_asset=0 + ... the full auth -> userMassInfo -> hub -> club -> tradePile -> trade/status + cycle then repeats for a SECOND fresh session ... +``` + +`auction_cancelled=1` is `cancel_active_for_core_item` firing: the pile move to +`club` ends the auction that put the card there, which is the coupled transition +that keeps pile membership and auction lifecycle from disagreeing. + +Two independent fresh sessions each rebuilt the state from durable storage, and the +operator confirmed the card was still in My Club. One session boundary was the +requirement; two is stronger. + +### Server state — 18/18, byte-identical before and after re-entry + +| Surface | Result | +|---|---| +| `/tradePile` | `total 0`, 0 rows, no reference to the item or the tradeId | +| `/tradePile/counts` | `count 0, selling 0, sold 0, offered 0` | +| `/trade/status` | tradeId `1000000178` → **`closed`**, `expires 0` — still resolves, correctly terminal | +| `/club` | **1966** items; `id=100000178 res=212188 rating=75 ST itemState=free untradeable=False` | +| Duplicate owned ids | **0** across all 1966 | +| Market store | listing `1000000178` = `cancelled`; **0 active, 0 reserved** anywhere | +| Coins | **29,843,976** unchanged for the entire test | +| Fix A | 0 `inactive` rows | + +The `1965 → 1966` club count is the pile-aware exclusion working in both directions: +the card left `/club` while actively listed and returned on cancel. A tradeId that +can still be asked about still answers — terminally — rather than vanishing. + +**No code change was required for either gap.** Both tests were designed to find out +whether the promoted implementation was already correct on paths it had not been +exercised on. It was. + +--- + +## FROZEN BASELINE — the known-good transfer-list lifecycle (2026-08-17) + +With both gaps closed, this lifecycle is the reference. A future change that alters +any line here is a regression until proven otherwise. + +```text +CLUB + itemState free, present in /club, absent from /tradePile + | PUT /item {pile:"trade"} + POST /auctionhouse (ISStart) + v +ACTIVE AUCTION + /tradePile: tradeState active, itemState forSale, 12 atoms, + expires counting down from duration, currentBid 0, bidState none + /tradePile/counts: count 1, selling 1 + /club: EXCLUDED while listed + /trade/status: agrees with the pile on every field + client: renders under LISTED ITEMS, CARD_OFFERSTATE = 5, non-actionable + | wall clock reaches created_at + duration + v +EXPIRED + /tradePile: tradeState expired, expires 0, itemState still forSale + client: row becomes ACTIONABLE, offers Return to Club + | PUT /item {pile:"club"} -> cancel_active_for_core_item + v +CLUB (terminal) + /tradePile: total 0 /tradePile/counts: all zero + /club: present again, itemState free market store: cancelled + /trade/status: old tradeId -> closed, expires 0 + coins: unchanged throughout + survives: FUT exit + re-entry, repeatedly +``` + +Invariants this baseline pins: + +* an item is never in limbo — it is in `/club` or in an active auction, never neither; +* `expires` is SECONDS REMAINING and must evolve with wall-clock; +* pile membership and auction lifecycle are separate facts that must be changed + together; +* a tradeId resolves on every route that can be asked about it, even when terminal; +* only real active auctions appear in `/tradePile` (Fix A); +* a listed item carries `itemState forSale` (Fix B), and the client decodes 5; +* an active own auction is intentionally non-actionable; +* coins move only when coins should move — this whole lifecycle moves none. + +What is still NOT established: the SOLD path (no counterparty exists yet; settlement +is implemented and unit-tested in Core but never client-validated — see +`MARKET_SOLD_SETTLEMENT.md`), `/tradePile/counts` exact FIFA semantics, and the AVM1 +action gate. + diff --git a/docs/evidence/market-lifecycle-2026-08-17/gap2-natural-expiry-samples.jsonl b/docs/evidence/market-lifecycle-2026-08-17/gap2-natural-expiry-samples.jsonl new file mode 100644 index 0000000..ec99403 --- /dev/null +++ b/docs/evidence/market-lifecycle-2026-08-17/gap2-natural-expiry-samples.jsonl @@ -0,0 +1,55 @@ +{"t": 1787012091, "present": true, "tradeState": "active", "expires": 3175, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012151, "present": true, "tradeState": "active", "expires": 3115, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012211, "present": true, "tradeState": "active", "expires": 3055, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012271, "present": true, "tradeState": "active", "expires": 2995, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012331, "present": true, "tradeState": "active", "expires": 2935, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012391, "present": true, "tradeState": "active", "expires": 2875, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012451, "present": true, "tradeState": "active", "expires": 2815, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012511, "present": true, "tradeState": "active", "expires": 2755, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012571, "present": true, "tradeState": "active", "expires": 2695, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012631, "present": true, "tradeState": "active", "expires": 2635, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012691, "present": true, "tradeState": "active", "expires": 2575, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012751, "present": true, "tradeState": "active", "expires": 2515, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012811, "present": true, "tradeState": "active", "expires": 2455, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012871, "present": true, "tradeState": "active", "expires": 2395, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012931, "present": true, "tradeState": "active", "expires": 2335, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787012991, "present": true, "tradeState": "active", "expires": 2275, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013051, "present": true, "tradeState": "active", "expires": 2215, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013111, "present": true, "tradeState": "active", "expires": 2155, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013171, "present": true, "tradeState": "active", "expires": 2095, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013231, "present": true, "tradeState": "active", "expires": 2035, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013291, "present": true, "tradeState": "active", "expires": 1975, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013351, "present": true, "tradeState": "active", "expires": 1915, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013411, "present": true, "tradeState": "active", "expires": 1855, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013471, "present": true, "tradeState": "active", "expires": 1795, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013531, "present": true, "tradeState": "active", "expires": 1735, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013591, "present": true, "tradeState": "active", "expires": 1675, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013651, "present": true, "tradeState": "active", "expires": 1615, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013711, "present": true, "tradeState": "active", "expires": 1555, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013771, "present": true, "tradeState": "active", "expires": 1495, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013831, "present": true, "tradeState": "active", "expires": 1435, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013891, "present": true, "tradeState": "active", "expires": 1375, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787013951, "present": true, "tradeState": "active", "expires": 1315, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014011, "present": true, "tradeState": "active", "expires": 1255, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014071, "present": true, "tradeState": "active", "expires": 1195, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014131, "present": true, "tradeState": "active", "expires": 1135, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014191, "present": true, "tradeState": "active", "expires": 1075, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014251, "present": true, "tradeState": "active", "expires": 1015, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014311, "present": true, "tradeState": "active", "expires": 955, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014371, "present": true, "tradeState": "active", "expires": 895, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014431, "present": true, "tradeState": "active", "expires": 835, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014491, "present": true, "tradeState": "active", "expires": 775, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014551, "present": true, "tradeState": "active", "expires": 715, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014611, "present": true, "tradeState": "active", "expires": 655, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014671, "present": true, "tradeState": "active", "expires": 595, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014731, "present": true, "tradeState": "active", "expires": 535, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014791, "present": true, "tradeState": "active", "expires": 475, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014851, "present": true, "tradeState": "active", "expires": 415, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014911, "present": true, "tradeState": "active", "expires": 355, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787014971, "present": true, "tradeState": "active", "expires": 295, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015031, "present": true, "tradeState": "active", "expires": 235, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015091, "present": true, "tradeState": "active", "expires": 175, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015151, "present": true, "tradeState": "active", "expires": 115, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015211, "present": true, "tradeState": "active", "expires": 55, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015271, "present": true, "tradeState": "expired", "expires": 0, "itemState": "forSale", "startingBid": 150, "buyNowPrice": 200, "total": 1, "credits": 29843976} +{"t": 1787015301, "present": false, "tradeState": null, "expires": null, "itemState": null, "startingBid": null, "buyNowPrice": null, "total": 0, "credits": 29843976} diff --git a/docs/evidence/market-lifecycle-2026-08-17/gap2-return-to-club-persistence.json b/docs/evidence/market-lifecycle-2026-08-17/gap2-return-to-club-persistence.json new file mode 100644 index 0000000..f982d3b --- /dev/null +++ b/docs/evidence/market-lifecycle-2026-08-17/gap2-return-to-club-persistence.json @@ -0,0 +1,91 @@ +{ + "gap": 2, + "test": "expired -> Return to Club -> full exit/re-entry persistence", + "date": "2026-08-17", + "item": { + "wire_item_id": 100000178, + "resourceId": 212188, + "rating": 75, + "preferredPosition": "ST", + "tradeId": 1000000178 + }, + "natural_expiry": { + "method": "read-only sampler polling /tradePile once a minute; expiry is derived from created_at + duration, so it was OBSERVED, never forced. No timestamp was mutated at any point.", + "samples": 55, + "transitions": [ + { + "t": 1787012091, + "tradeState": "active", + "expires": 3175, + "itemState": "forSale" + }, + { + "t": 1787015271, + "tradeState": "expired", + "expires": 0, + "itemState": "forSale", + "note": "natural expiry reached; itemState stayed forSale through the transition" + }, + { + "t": 1787015301, + "tradeState": null, + "total": 0, + "note": "row left the pile entirely \u2014 the operator's Return to Club" + } + ], + "auction_duration_secs": 3600 + }, + "return_to_club_server_state": { + "tradePile_total": 0, + "tradePile_rows": 0, + "tradePile_counts": { + "count": 0, + "maxAuctionsAllowed": 100, + "offered": 0, + "selling": 0, + "sold": 0 + }, + "trade_status": { + "tradeId": 1000000178, + "tradeState": "closed", + "expires": 0 + }, + "club_items": 1966, + "club_row": { + "id": 100000178, + "resourceId": 212188, + "rating": 75, + "preferredPosition": "ST", + "itemState": "free", + "untradeable": false + }, + "duplicate_owned_ids": 0, + "market_store": { + "listing_1000000178": "cancelled", + "active": 0, + "reserved": 0, + "all_by_state": { + "cancelled": 3 + } + }, + "coins": 29843976, + "fix_a_inactive_rows": 0, + "checks_passed": "18/18" + }, + "status": "GAP 2 CLOSED \u2014 Return to Club is durable across repeated full FUT exit/re-entry", + "exit_reentry": { + "observed": true, + "operator_report": "yes that card is still there", + "host_log_evidence": [ + "route=move-items wire=100000178 pile=club auction_cancelled=1", + "route=auth-delete", + "route=auth ... ip=10.10.0.105 persona=33068179 sid_opened=true (fresh session)", + "route=hub clubPlayers=1966 auctionCount=0", + "route=club total=1986 emitted=1966 dropped_no_asset=0", + "the full auth -> userMassInfo -> hub -> club -> tradePile -> trade/status cycle repeated for a SECOND fresh session" + ], + "session_boundaries_crossed": 2, + "server_checks_after_reentry": "18/18, identical to before the re-entry" + }, + "code_change_required": false +}