docs: capture the unlisted transfer-list state and model the pile/auction boundary
Q2 measured, not guessed. The operator moved a card Club -> Transfer List without listing it (PUT /item, no POST /auctionhouse) and the state was captured read-only. Finding: we do not represent the unlisted state on the wire AT ALL. Such an item is byte-identical to a club item -- itemState `free`, no `pile` field emitted, still returned in /club and counted in clubPlayers -- while an actively-listed item is correctly excluded from /club and present in tradePile. Only the host's own pile store knows the difference. Trade pile held 6 items: 1 listed, 5 unlisted. The FIFA 17 ENCODING of that state stays UNKNOWN on purpose: returned itemData.pile is numeric with an unrecovered mapping, and tradeState is a closed table walk where an unrecognised bidState is silently swallowed as `none`, so a wrong enum produces a plausible-looking but wrong UI. The corpus warns `inactive` decodes but no client path treats it specially. One client-only discriminator is recorded instead. Also models the domain boundary both limbo bugs came from: pile membership and auction lifecycle are separate facts requiring coordinated transitions. States the testable invariant -- an item must never be simultaneously excluded from /club and absent from /tradePile -- with the two ways it was reachable and the commits that closed each.
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"auctionCount": 1,
|
||||
"clubPlayers": 1965,
|
||||
"tradePile": {
|
||||
"count": 1,
|
||||
"selling": 1,
|
||||
"sold": 0
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
"buyNowPrice": 15000,
|
||||
"coinsProcessed": 0,
|
||||
"currentBid": 0,
|
||||
"expires": 2220,
|
||||
"expires": 1199,
|
||||
"itemData": {
|
||||
"assetId": 20801,
|
||||
"attributeList": [
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"buyNowPrice": 15000,
|
||||
"coinsProcessed": 0,
|
||||
"currentBid": 0,
|
||||
"expires": 2220,
|
||||
"expires": 1199,
|
||||
"itemData": {
|
||||
"assetId": 20801,
|
||||
"attributeList": [
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"100000059": {
|
||||
"assetId": 158023,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 89
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 90
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 86
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 96
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 26
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 61
|
||||
}
|
||||
],
|
||||
"cardassetid": 158023,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 158023,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000059,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 52,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "RW",
|
||||
"rareflag": 1,
|
||||
"rating": 93,
|
||||
"resourceId": 158023,
|
||||
"teamid": 241,
|
||||
"untradeable": false
|
||||
},
|
||||
"100000122": {
|
||||
"assetId": 177003,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 74
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 86
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 89
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 72
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 66
|
||||
}
|
||||
],
|
||||
"cardassetid": 177003,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 177003,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000122,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 10,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "CM",
|
||||
"rareflag": 1,
|
||||
"rating": 89,
|
||||
"resourceId": 177003,
|
||||
"teamid": 243,
|
||||
"untradeable": false
|
||||
},
|
||||
"100000127": {
|
||||
"assetId": 177003,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 74
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 86
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 89
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 72
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 66
|
||||
}
|
||||
],
|
||||
"cardassetid": 177003,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 177003,
|
||||
"discardValue": 1500,
|
||||
"fitness": 99,
|
||||
"id": 100000127,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 53,
|
||||
"nation": 10,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "CM",
|
||||
"rareflag": 1,
|
||||
"rating": 89,
|
||||
"resourceId": 177003,
|
||||
"teamid": 243,
|
||||
"untradeable": false
|
||||
},
|
||||
"100004866": {
|
||||
"assetId": 163824,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 43
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 56
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 62
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 82
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 82
|
||||
}
|
||||
],
|
||||
"cardassetid": 163824,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 163824,
|
||||
"discardValue": 900,
|
||||
"fitness": 99,
|
||||
"id": 100004866,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 13,
|
||||
"nation": 50,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "CB",
|
||||
"rareflag": 1,
|
||||
"rating": 83,
|
||||
"resourceId": 163824,
|
||||
"teamid": 7,
|
||||
"untradeable": false
|
||||
},
|
||||
"100004867": {
|
||||
"assetId": 172610,
|
||||
"attributeList": [
|
||||
{
|
||||
"index": 0,
|
||||
"value": 69
|
||||
},
|
||||
{
|
||||
"index": 1,
|
||||
"value": 33
|
||||
},
|
||||
{
|
||||
"index": 2,
|
||||
"value": 47
|
||||
},
|
||||
{
|
||||
"index": 3,
|
||||
"value": 57
|
||||
},
|
||||
{
|
||||
"index": 4,
|
||||
"value": 80
|
||||
},
|
||||
{
|
||||
"index": 5,
|
||||
"value": 76
|
||||
}
|
||||
],
|
||||
"cardassetid": 172610,
|
||||
"cardsubtypeid": 0,
|
||||
"contract": 7,
|
||||
"definitionId": 172610,
|
||||
"discardValue": 900,
|
||||
"fitness": 99,
|
||||
"id": 100004867,
|
||||
"itemState": "free",
|
||||
"itemType": "player",
|
||||
"leagueId": 31,
|
||||
"nation": 54,
|
||||
"owners": 1,
|
||||
"playStyle": 250,
|
||||
"preferredPosition": "CB",
|
||||
"rareflag": 1,
|
||||
"rating": 80,
|
||||
"resourceId": 172610,
|
||||
"teamid": 54,
|
||||
"untradeable": false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user