From ae5feb05b74451022f0964dd3d7a0a59e2335d2e Mon Sep 17 00:00:00 2001 From: funman300 Date: Mon, 17 Aug 2026 18:25:23 +0000 Subject: [PATCH] docs: record the external FIFA 17 FUT hub behavioural spec + cross-check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator-supplied research document (authored outside this repo) describing the player-visible FUT hub state machine. Stored verbatim so it cannot drift, with a provenance header pinning its standing: it is a BEHAVIOUR target, never a protocol reference. Its own §43 already forbids inventing route/field/sentinel/empty-state details from it, which matches project policy (guessing wire spellings is the documented client-freeze class). Appended a repo-grounded cross-check that tags each relevant claim CONFIRMED / CONFLICT / GAP / UNVERIFIED, so a future agent cannot mistake the aspirational parts for observed behaviour. Notably it CONFLICTS with the recovered client tables twice (Manager League is deliberately excluded from the consumable overlay; there is no apply-consumable endpoint upstream at all), and it usefully confirms that "sent to the Transfer List but not currently listed" is a real FUT state -- which is exactly the limbo f2c4927 worked around. --- docs/FIFA17_HUB_BEHAVIOR_SPEC.md | 1628 ++++++++++++++++++++++++++++++ 1 file changed, 1628 insertions(+) create mode 100644 docs/FIFA17_HUB_BEHAVIOR_SPEC.md diff --git a/docs/FIFA17_HUB_BEHAVIOR_SPEC.md b/docs/FIFA17_HUB_BEHAVIOR_SPEC.md new file mode 100644 index 0000000..c2ba15a --- /dev/null +++ b/docs/FIFA17_HUB_BEHAVIOR_SPEC.md @@ -0,0 +1,1628 @@ +# FIFA 17 FUT Hub — Menu, Navigation, State, and Tile-Outcome Specification + +> **Provenance.** Authored OUTSIDE this repository (ChatGPT research review), +> supplied by the operator on 2026-08-17 and recorded verbatim below from +> `## Purpose` onward. It is a **behavioural target**, not a protocol reference, +> and not a description of what OpenFUT currently does. +> +> **Standing of its claims.** Treat §42 ("What Is Historically High Confidence") +> as FUT behaviour to aim at, and obey its own §43: route names, field names, +> sentinel ids, empty-state shapes and request sequencing MUST come from client +> captures or the Python oracle (`fifa17-recon/tools/utas_server.py`) — never +> from this document. Where this document and observed client/oracle behaviour +> disagree, **the observation wins**. That is already project policy: guessing +> wire spellings is the documented client-freeze class. +> +> **Do not edit the verbatim body.** A claim-by-claim cross-check against +> OpenFUT as actually built is kept in +> "Cross-check against OpenFUT as built" at the end of this file. +> Update that section instead. + +--- + +## Purpose + +This document describes how the **FIFA 17 FUT console/PC hub is supposed to look, navigate, and behave from the player's perspective**, with emphasis on what the backend must cause the client to do after each tile or action is selected. + +This is not merely a list of endpoints. The implementation target is the **behavioral state machine of FIFA 17 FUT**: + +**FUT state → hub tile → sub-screen → explicit action → state mutation → result/reward → return to updated FUT state.** + +The FIFA 17 manual explicitly describes FUT as a server-connected mode built around squads, packs, the Transfer Market, single-player and online competitions, chemistry and inventory. All FUT modes require server connectivity. + +--- + +# 1. Global FUT Hub Shell + +The console/PC FIFA 17 FUT interface uses a stadium background and large rectangular tiles. The selected tile becomes the distinctive **FIFA 17 yellow**, while inactive tiles are dark. Screenshots show the club/account header persisting across FUT screens, including the club badge/name, establishment date, Coins, FIFA Points and W-D-L record. + +The primary navigation sequence visible across the actual FIFA 17 interface is approximately: + +|Section|Purpose| +|---|---| +|**FUT Central**|Landing/live/tutorial information| +|**Single Player**|Offline Seasons, Tournament, Draft, SBC and TOTW| +|**Online**|FUT Champions, Online Season, Online Draft, Friendly Seasons| +|**Squads**|Active Squad, My Squads, Concept Squads| +|**Store**|Purchasable and unopened packs| +|**Transfers**|Transfer Market, Transfer Targets, Transfer List| +|**My Club**|Owned players, staff, club items and consumables| +|**Leaderboards**|FUT ranking/comparison| +|**Unassigned**|Conditional unresolved-item state| + +Actual FIFA 17 screenshots show the progression through FUT Central → Single Player → Online → Squads and, farther across the interface, Transfers → My Club → Leaderboards → Unassigned. + +### Backend implication + +The top-level FUT hub is **not supposed to be a set of independent static pages**. The same account state must drive all of them. + +For example, if a player buys an item: + +`Transfer Market → Buy Now → ownership change → coin debit → Transfer Targets/New Item state → My Club` + +must all agree about the result. + +Likewise: + +`SBC → Submit → consume 11 items → grant reward pack → Store/My Packs` + +must produce one coherent state transition. + +Tile text itself can also be dynamic. An actual FIFA 17 Online screenshot shows the FUT Champions tile changing its text to say that Weekend League rewards are ready to be claimed. + +--- + +# 2. FUT Central + +## What FUT Central is + +FUT Central is best regarded as the **landing/dashboard area for the club**, not a separate gameplay economy. + +Historical documentation confirms that **Manager Tasks can be entered from FUT Central**, as well as from the lower-left area of My Club. + +FIFA 17 had **14 Manager Tasks**. Completing individual tasks produced small rewards and completing all fourteen granted a Premium Gold Pack. + +The fourteen tasks documented for FIFA 17 were: + +1. Open the starter squad pack. +2. Name the club. +3. Put the starting XI into correct positions. +4. Cycle through player-item views. +5. Create three green chemistry links from one player. +6. Change squad formation. +7. Swap a player from the club into the Active Squad. +8. Finish a FUT match. +9. Apply a contract consumable. +10. Apply a fitness consumable. +11. Sell a player on the Transfer Market. +12. Buy a player on the Transfer Market. +13. Buy a consumable on the Transfer Market. +14. Complete a Squad Building Challenge. + +### Backend outcome + +Manager Tasks should therefore be stored as actual progress flags, not simply decorative client text. + +Example: + +`buy_player_on_market = false` + +After a completed qualifying purchase: + +`buy_player_on_market = true` + +The appropriate Manager Task reward becomes claimable/awarded and progress updates when FUT Central is revisited. + +### Important fidelity warning + +The exact set and positioning of every promotional tile that EA served through FUT Central during FIFA 17's entire live season is not completely preserved in public archives. **Do not invent a permanent static Central layout simply to fill space.** + +The safe implementation is: + +**Central = dynamic dashboard/live-content surface + Manager Tasks + state summaries/promotions.** + +If the client requests a particular historical Central widget whose protocol is not yet understood, capture that route from the client rather than fabricating payload fields. + +--- + +# 3. Single Player Hub + +A real FIFA 17 screenshot verifies the main Single Player layout: + +|Tile|Visible state| +|---|---| +|**Single Player Season**|Large upper-left tile; displays current division| +|**Single Player Draft**|Upper-right| +|**Squad Building Challenges**|Right side| +|**Single Player Tournament**|Large lower-left tile| +|**Team of the Week**|Lower-right; can advertise a new/current challenge| + +## 3.1 Single Player Season + +### Selecting the tile + +The expected destination is the current offline-season screen or, where appropriate, season selection. + +EA's own screenshot of the Single Player Season screen contains: + +**Play Match**, **Season History**, **Current Season**, and **Fixture List**. + +The current-season pane contains Division, record, games remaining, projected points and the hold/promotion thresholds. + +### Competition rules + +FIFA 17 FUT Seasons consist of **10 games** and use a promotion/hold/relegation structure from Division 10 through Division 1. Higher divisions provide larger rewards. + +### Expected flow + +`Single Player Season` + +→ current season/division + +→ `Play Match` + +→ opponent/match preparation + +→ gameplay + +→ match result + +→ season table/progress updated + +→ reward if promotion/title/relegation/end-of-season condition reached + +→ return to Current Season. + +### Backend state that matters + +At minimum: + +`division` + +`matches_played` + +`wins` + +`draws` + +`losses` + +`points` + +`games_remaining` + +`promotion_threshold` + +`title_threshold` + +`relegation/hold threshold` + +`fixture/opponent state` + +`season reward state` + +### Match-completion consequences + +A completed FUT match is not isolated from club state. Contracts are consumed for players who participate, while unused subs/reserves do not consume a contract. Fitness also changes through match participation. + +So after a match: + +**match result + season progress + overall club record + coins + player contracts/fitness** + +must be internally consistent. + +--- + +# 4. Single Player Tournament + +Selecting **Single Player Tournament** should open available tournament information or an active tournament bracket. + +FIFA 17's manual defines FUT tournaments as **four-round knockout competitions**. Winning individual matches earns Coins; winning a tournament can grant trophies, Coins and Packs. + +The expected lifecycle is: + +`Tournament browser` + +→ inspect entry requirements/reward + +→ enter + +→ Round 1 + +→ Quarterfinal + +→ Semifinal + +→ Final + +→ tournament completion/reward. + +A loss terminates that tournament run. + +### Backend requirements + +Tournament content needs server-side definitions for availability, entry requirements, opponent configuration, reward configuration and current progression. + +The client therefore needs to distinguish at least: + +**available**, **locked/ineligible**, **entered**, **round in progress**, **eliminated**, and **completed/rewarded**. + +Do not treat the tile as a generic “play an AI match” shortcut. + +--- + +# 5. Single Player Draft + +FUT Draft allows the player to use footballers they do not own. The player assembles a temporary Draft squad and then competes in a four-round elimination tournament. Better finishes provide better rewards. + +For FIFA 17 the standard entry was **15,000 Coins or 300 FIFA Points**. + +### Expected flow + +`Single Player Draft` + +→ if no active run, Draft Entry screen + +→ choose entry/payment method + +→ debit entry currency + +→ formation selection + +→ sequential player choices + +→ completed Draft squad + +→ Draft match 1 + +→ continue while winning + +→ first loss or fourth win terminates run + +→ reward allocation + +→ run becomes complete + +→ user may enter a new Draft. + +### Important architecture distinction + +Draft players are **not normal owned club inventory**. + +The Draft needs its own temporary roster/run state. The manual explicitly describes Draft as a way to play with players the user does not own. + +Therefore the implementation should not accidentally create permanent owned player items when a player is selected during drafting. + +--- + +# 6. Squad Building Challenges + +SBC was introduced as a new FUT mode in FIFA 17. The FIFA 17 manual describes the core contract very clearly: build a squad satisfying specified requirements, then **exchange that squad for rewards**. + +Historical FIFA 17 material shows four useful categories over the game's lifecycle: + +**Basic**, **Advanced**, **Leagues**, and **Live**. + +On first entry the user is introduced to the mode/tutorial. Individual Challenges can be grouped; completing the entire group can produce an additional group reward. + +A real FIFA 17 SBC screen shows challenges such as Two Nations and displays requirements including nationality count, minimum chemistry and number of players, with a Submit action when requirements are satisfied. + +### Expected flow + +`Squad Building Challenges` + +→ category/group list + +→ choose group + +→ choose individual Challenge + +→ challenge squad screen + +→ fill players + +→ requirements continuously re-evaluated + +→ `Submit` + +→ confirmation + +→ submitted player items permanently removed + +→ Challenge marked complete + +→ individual reward granted + +→ if final Challenge in group, group reward granted + +→ return to group with updated completion state. + +### Critical backend rule + +**SBC submission is destructive.** + +The submitted items are exchanged. They are not temporarily hidden, loaned or moved into another squad. + +Historical descriptions explicitly warn that submitted players disappear from the club in exchange for the reward. + +Therefore Submit should be effectively atomic: + +`validate requirements → validate ownership → consume exact item instances → mark challenge complete → grant reward` + +A partial transaction would produce severe inventory desynchronization. + +### SBC states worth implementing + +Challenge definitions should be able to represent: + +**available**, **locked**, **completed**, **repeatable/non-repeatable**, **expired**, **requirements**, **challenge reward**, **group reward**, and **completion progress**. + +--- + +# 7. Team of the Week + +The Single Player hub visibly contains a **Team of the Week** tile and can display its live/current challenge state. + +EA's FIFA 17 Team of the Week material explicitly describes that week's complete squad as **available to challenge in FUT**. + +### Expected outcome + +`Team of the Week` + +→ display current TOTW squad/challenge + +→ inspect opposing lineup + +→ select challenge/play + +→ choose applicable difficulty/settings + +→ AI match + +→ result/reward state + +→ return. + +The crucial backend responsibility is therefore to expose a **current active special squad**, rather than making the tile point to the user's own squad or to a generic season opponent. + +--- + +# 8. Online Hub + +A genuine FIFA 17 Online screenshot verifies this layout: + +|Tile|Purpose| +|---|---| +|**FUT Champions**|Large upper-left| +|**Online Draft**|Upper-right| +|**Online Season**|Large lower-left| +|**Friendly Seasons**|Lower-right| + +The FUT Champions tile can dynamically say that Weekend League rewards are ready to be claimed. + +--- + +# 9. FUT Champions + +FUT Champions was one of FIFA 17's major new modes on Xbox One, PS4 and PC. EA described it as daily knockout tournaments feeding qualification into a Weekend League, with Weekend League performance determining ranks and rewards. + +### Weekday state + +The user can access **Daily Knockout Tournaments**. + +These could have changing entry requirements and rewards. Winning the knockout tournament could qualify the user for the Weekend League. + +### Weekend state + +A qualified player enters the Weekend League and plays ranked matches. Wins determine the player's Weekend League rank/reward tier. Historical FIFA 17 ranks included Bronze, Silver, Gold, Elite and Top 100 tiers. + +### Reward state + +After the competition period, the same FUT Champions tile may become a claim state: + +**“Your Weekend League rewards are ready to be claimed!”** is visibly shown by the actual FIFA 17 interface. + +### Therefore FUT Champions is a state machine, not one endpoint + +Possible hub states include conceptually: + +`Daily Knockout available` + +`not qualified` + +`qualified for Weekend League` + +`Weekend League active` + +`Weekend League complete` + +`ranking/reward pending` + +`rewards available` + +`rewards claimed` + +The tile text and destination should depend on that state. + +An implementation that always returns a generic FUT Champions page would miss a major part of FIFA 17's intended UX. + +--- + +# 10. Online Season + +Online Seasons follows the same core season structure as offline seasons but against human opponents. + +The FIFA 17 manual specifies 10-game Seasons, promotion/hold/relegation and progression from Division 10 toward Division 1. + +### Flow + +`Online Season` + +→ current division/season + +→ `Play Match` + +→ matchmaking/opponent search + +→ pre-match connection/squad validation + +→ online gameplay + +→ result + +→ points/record/division state updated + +→ applicable season reward + +→ return to season. + +The backend should not create an isolated result record. The result affects: + +**Online Season record, FUT club record, match coins/rewards, player match-state changes and possible promotion/relegation/title conditions.** + +--- + +# 11. Online Draft + +Online Draft uses the same temporary Draft squad-building process as Single Player Draft, but the four elimination games are online. FIFA 17 documentation explicitly states that Draft competitions may be played in single-player or online multiplayer. + +Therefore Draft roster generation should ideally be shared between both modes, while match-opponent handling differs. + +The run state must persist between matches. + +--- + +# 12. Friendly Seasons + +Friendly Seasons lets a user challenge a friend in a **five-match season**. + +The game tracks results/statistics against each friend and identifies the current title holder. + +### Flow + +`Friendly Seasons` + +→ friend/opponent selection + +→ friendship season status + +→ play match + +→ update head-to-head season + +→ after season resolution, title-holder state updated. + +This is not simply an unranked one-off friendly button. + +--- + +# 13. Squads Hub + +An official EA screenshot of the FIFA 17-era console interface shows the Squads tab divided into a large current/Active Squad tile alongside **My Squads** and **Concept Squads**. + +--- + +# 14. Active Squad + +Active Squad is the user's playable current squad. + +The FIFA 17 manual specifically describes the Active Squad screen as the place to swap players, view Chemistry and use player Actions. Chemistry depends on position plus nationality, league and club links, while manager and loyalty can also contribute. + +### Expected functionality + +The screen represents: + +starting XI + +substitutes + +reserves + +manager + +formation + +squad rating + +team Chemistry + +individual player status. + +Selecting a player opens Actions such as swapping/adding another player and applying consumables where appropriate. + +Contracts and Fitness are also actively represented here. EA's manual explicitly directs the player to highlight a player, open the Actions menu and choose **Apply Consumable** for contracts or fitness. + +### Backend requirement + +Squad slots must reference **actual owned item instances**, not merely player definitions. + +The server needs to distinguish: + +`player definition/card type` + +from + +`this user's owned player item` + +from + +`this squad slot referencing that item`. + +Otherwise moving, selling, SBC-submitting or quick-selling a player can corrupt squad state. + +--- + +# 15. My Squads + +Selecting **My Squads** should expose the user's stored squads and permit management such as selecting/creating and using another squad. + +The key model distinction is: + +**Club contains items. Squads contain references to a subset of usable items.** + +A player can own many players in My Club while only eleven plus bench/reserves occupy one squad. + +The manual reinforces this separation by describing My Club as the storage location for players not in the current squad and other owned items. + +--- + +# 16. Concept Squads + +Concept Squads are **planning-only squads**. + +EA describes the feature as allowing a user to plan future squads using the **entire FUT player catalogue**, not merely owned players. + +The FIFA 17 manual likewise says Concept Squads can use every player available in FUT and are intended to test replacements, chemistry or whole teams before investing in the Transfer Market. + +### Backend implication + +A concept player in a concept squad is **not an owned inventory item**. + +Concept state should therefore never accidentally: + +increase club inventory, + +permit quick sell, + +permit transfer listing, + +or qualify as owned input for an SBC. + +--- + +# 17. Store + +FIFA 17's Store is used to purchase packs and receive/open reward packs. The manual says packs may be purchased in the Store or earned from modes such as Tournaments and Seasons, and that promotions are regularly added. + +The real FIFA 17 Store visually separates regular Bronze/Silver/Gold packs from promotional offerings. A contemporaneous screenshot shows a **Promo Packs** tab with an offer that includes a pack limit and expiration timer. + +### Regular FIFA 17 pack baseline + +Historical FIFA 17 pack documentation gives these standard Store values: + +|Pack|Cost| +|---|---:| +|Bronze Pack|400 Coins| +|Premium Bronze Pack|750 Coins| +|Silver Pack|2,500 Coins / 50 FIFA Points| +|Premium Silver Pack|3,750 Coins / 75 FIFA Points| +|Gold Pack|5,000 Coins / 100 FIFA Points| +|Premium Gold Pack|7,500 Coins / 150 FIFA Points| + +Promotional packs are server/live-content definitions and should not be hardcoded as permanently available. Historical FIFA 17 documentation explicitly distinguishes regular packs, temporary promo packs and free/reward packs. + +--- + +# 18. Purchased Pack Flow + +Selecting a Store pack should not immediately grant invisible inventory. + +The intended lifecycle is: + +`Browse Packs` + +→ select pack + +→ choose valid payment source + +→ purchase confirmation + +→ currency debit + +→ pack entitlement/content generation + +→ pack-opening/reveal presentation + +→ **New Items** + +→ item assignment. + +### Correct transaction boundary + +Prefer an atomic backend transition approximately equivalent to: + +`validate offer still active` + +`validate funds` + +`debit exact currency` + +`create deterministic/openable pack result or entitlement` + +`return success` + +The client then performs reveal/assignment. + +A failed purchase must not debit currency without creating the corresponding pack/content. + +--- + +# 19. Reward / Unopened Packs + +Reward packs can originate from Seasons, Tournaments, Draft, SBC, FUT Champions, Manager Tasks and other configured content rather than Store payment. FIFA 17 documentation specifically identifies free/reward packs from Draft, tournaments and Seasons. + +These should ultimately use the **same pack-opening and New Items pipeline** as a purchased pack. + +That is an important architecture rule: + +**pack source is separate from pack-opening semantics.** + +Sources may be: + +`store purchase` + +`season reward` + +`tournament reward` + +`draft reward` + +`SBC reward` + +`Champions reward` + +`manager task` + +but once an unopened pack exists, opening it should use one consistent entitlement/reveal/assignment system. + +--- + +# 20. New Items and Unassigned + +FIFA's post-pack interface has a genuine unresolved-item state. + +Historical UI material uses headings/actions including **New Items**, **Send To Transfer List**, **Keep Items** and quick-sell behavior. + +The FIFA 17 Companion design also explicitly shows **UNASSIGNED**, with New Items, Duplicate Items, Send All to Club, Send duplicates to Transfer List and Quick Sell All concepts. + +### Backend implication + +Opening a pack does **not** mean “insert every generated item into club inventory immediately.” + +Instead: + +`pack → revealed items → unassigned/new items` + +and each item must then be resolved appropriately. + +Possible destinations include: + +**Club** + +**Transfer List**, when eligible + +**Quick Sell/discard** + +or continued **Unassigned** state. + +### Duplicate handling + +Duplicate ownership is meaningful. The UI needs to know when an item cannot simply be sent to the Club and must remain unresolved or be moved/discarded. + +Therefore the server should not lie to the client by reporting zero unassigned items merely because the reveal call succeeded. + +The **Unassigned** navigation element should be conditional/state-driven. + +--- + +# 21. Transfers Hub + +FIFA 17's Transfer Market is a substantial subsystem, not one purchase endpoint. + +The manual defines it as the hub for purchasing, listing and selling items. Player filtering includes name, nationality, league, club, quality, position, Chemistry Style and price. + +EA's own FUT documentation likewise shows searching by quality, position, Chemistry Style, nationality, league and club, and explains both Bid and Buy Now. + +Conceptually the Transfers area consists of: + +**Transfer Market** + +**Transfer Targets** + +**Transfer List**. + +--- + +# 22. Transfer Market Search + +A FIFA 17 transfer search needs multiple item categories, not just players. FUT's market includes players, consumables, staff and club items. + +### Player search filters + +The historical client expects concepts including: + +player/name + +quality + +position + +Chemistry Style + +nation/region + +league + +club + +minimum/maximum price parameters. + +The search result should contain actual auction/listing objects. + +--- + +# 23. Live Search Results + +A real FIFA 17 Transfer Market screenshot shows a selected listing with: + +**Start Price** + +**Current Bid** + +**Buy Now Price** + +**Time Remaining** + +and actions: + +**Compare Price** + +**Make Bid** + +**Buy Now** + +**Add to Transfer Targets**. + +This means the backend must model an **auction listing**, not just `(item, price)`. + +A listing needs at least conceptual state for: + +seller + +item instance + +start price + +current bid + +highest bidder + +Buy Now value + +expiry + +listing status. + +--- + +# 24. Make Bid + +Expected behavior: + +`user chooses Make Bid` + +→ validate listing active + +→ validate new bid satisfies increment/minimum rules + +→ validate bidder funds + +→ register new high bid + +→ listing becomes/updates an entry in Transfer Targets + +→ user can subsequently be outbid, win, or lose. + +EA documentation confirms that bids must exceed the current/start requirement and that Transfer Targets tracks actively bid-on/watchlisted items, won items and expired unsuccessful bids. + +A bid cannot therefore be represented as an immediate normal purchase. + +--- + +# 25. Buy Now + +Expected behavior: + +`Buy Now` + +→ listing-active check + +→ coin validation + +→ debit buyer + +→ listing terminates as sold + +→ seller eventually receives proceeds minus tax + +→ item ownership transfers to buyer + +→ buyer receives acquired-item state + +→ item can be assigned appropriately. + +FUT uses Coins as the Transfer Market currency. EA documentation also states that market transactions charge **5% of the sale price**. + +That 5% sink should be part of authentic economy behavior. + +--- + +# 26. Transfer Targets + +Transfer Targets must distinguish at least: + +watched listing + +active bid + +currently winning + +outbid + +won + +expired/lost. + +EA specifically describes this screen as tracking active bids, watched items, items won and bids on expired items. + +Do not collapse all of these to a flat item array. + +--- + +# 27. Transfer List + +Transfer List represents items the user intends to sell and their listing lifecycle. + +EA documentation identifies: + +items sent to the Transfer List but not currently listed, + +items currently for sale, + +sold items, + +and unsold items. + +Creating a listing requires a starting price, Buy Now price where applicable, and listing duration. The UI also supports **Compare Price**. + +### Expected lifecycle + +`Owned tradeable item` + +→ Send/List on Transfer Market + +→ configure price/duration + +→ Active Listing + +→ either Sold or Expired Unsold + +→ clear/relist/resolve. + +Untradeable items must not successfully enter this flow. + +--- + +# 28. My Club + +The FIFA 17 manual defines My Club as the place that stores players not in the current Squad plus Consumables and other Items. + +A real FIFA 17 My Club screenshot shows the subcategories: + +**Players** + +**Staff** + +**Club Items** + +**Consumables**. + +--- + +# 29. Players + +The Players section is the owned-player inventory outside the currently displayed squad context. + +From an owned player, applicable actions should connect into systems such as: + +squad assignment/swap + +Transfer Market listing + +Compare Price + +Quick Sell + +player details/bio + +and applicable consumable management. + +What actions appear depends on item state such as tradeable/untradeable, current squad membership and ownership. + +--- + +# 30. Staff + +Staff is a separate owned-item family from players. + +This should remain a distinct inventory type and Transfer Market category rather than being serialized as unusual player cards. EA's Transfer Market documentation explicitly includes staff as a separate item class. + +--- + +# 31. Club Items + +An actual FIFA 17 My Club screenshot verifies club-item categories including: + +**Badge** + +**Home Kit** + +**Away Kit** + +**Ball** + +**Stadium**. + +The screenshot also shows an action such as **Make Active**, establishing that ownership and active club configuration are separate states. + +Example: + +`owned home kits = [A, B, C]` + +while: + +`active_home_kit = B`. + +Changing the active kit should not destroy or recreate the underlying item. + +--- + +# 32. Consumables + +Consumables are inventory items used on players/managers. + +FIFA 17 specifically had eight consumable families: + +**Player Training** + +**Goalkeeper Training** + +**Position** + +**Manager League** + +**Contracts** + +**Fitness** + +**Healing** + +**Chemistry Styles**. + +Contracts, fitness and Chemistry Styles are explicitly integrated into the Active Squad/player Actions workflow in the FIFA 17 manual. + +The correct state transition is therefore: + +`owned consumable instance` + +→ Apply Consumable + +→ verify target compatibility + +→ modify target state + +→ consume consumable item. + +Not: + +`change player state without removing consumable`. + +--- + +# 33. Leaderboards + +FIFA 17's manual says the FUT Leaderboards allow comparison with friends and the **global top 100**, reflecting progression as the user builds the club and plays Seasons/Tournaments. + +Therefore this should be treated as **read-only calculated/server data**, not as persistent editable player state. + +Do not confuse the normal FUT Leaderboards with the separate FUT Champions ranking system. FUT Champions also had its own monthly/weekly ranking structure. + +--- + +# 34. Match Preparation and Validation + +Any mode that launches the user's normal FUT squad should eventually converge on common squad/match validation. + +Before starting a match, relevant state includes: + +valid starting XI + +valid formation + +player ownership + +contracts + +lineup/bench + +competition entry requirements + +and mode-specific eligibility. + +The FIFA 17 manual states that players require Contracts to play matches. + +Therefore a backend should be capable of refusing match launch for an invalid match squad rather than allowing an impossible state and repairing it afterward. + +--- + +# 35. Common Post-Match Transaction + +A useful OpenFUT mental model is to treat match completion as a coordinated transaction. + +A normal result can affect: + +|State family|Example effect| +|---|---| +|Club record|W/D/L update| +|Competition|season points, tournament round, Draft round, Champions record| +|Economy|match Coins/reward| +|Players|contracts, fitness and relevant match stats| +|Progression|Manager Task or competition qualification| +|Rewards|pack/coin entitlement| +|Hub|division/rank/reward-ready tile changes| + +The manual directly documents contracts, fitness, Season progression and competition rewards as interconnected FUT concepts. + +Do not implement match reward and competition progression as unrelated responses that can disagree. + +--- + +# 36. The Most Important Backend Rule: Navigation vs Mutation + +The hub should behave predictably according to this distinction. + +### Navigation/read operations + +Opening: + +Single Player + +Online + +Season details + +Transfer search + +My Club + +Leaderboards + +SBC browser + +Store browser + +should normally **read state**, not mutate the economy. + +### Explicit mutations + +State changes should occur at actions such as: + +purchase pack + +open pack + +assign item + +quick sell + +make bid + +Buy Now + +list item + +apply consumable + +submit SBC + +enter paid Draft + +claim reward + +finish match. + +This distinction is extremely important when emulating the original UI because the FIFA client often navigates several levels before the user confirms an action. + +Do not mutate because the client merely asked to display a tile. + +--- + +# 37. State Must Propagate Across Menus + +A successful action should immediately make every dependent FUT screen tell the same story. + +### Example A: Pack Purchase + +Before: + +`coins = 10,000` + +User buys Premium Gold Pack for `7,500`. + +After: + +`coins = 2,500` + +plus new pack/open state. + +The FUT header, Store, My Club and New Items all need to agree. + +### Example B: Quick Sell + +Owned item is quick-sold. + +After: + +item absent from club/unassigned + +Coins increased by quick-sell amount + +header balance updated. + +### Example C: SBC Submission + +Eleven owned item instances submitted. + +After: + +those items absent from Club and any permissible squad context + +Challenge completed + +reward created + +unopened-pack/reward state updated if reward is a pack. + +### Example D: Transfer Buy Now + +After: + +buyer Coins reduced + +listing inactive/sold + +item no longer belongs to seller + +item belongs to buyer/acquisition state + +Transfer Targets reflects completed purchase + +seller-side proceeds follow auction-resolution rules. + +--- + +# 38. Empty States Are Part of the Protocol + +The backend must deliberately support empty conditions. + +Examples include: + +no unopened packs + +no unassigned items + +no Transfer Targets + +empty Transfer List + +no Concept Squads + +no extra My Squads + +no current promotional packs + +completed Manager Tasks + +no active Draft + +no active tournament + +no claimable Champions reward. + +An empty state should be returned **in the shape the FIFA 17 client expects for that particular feature**. + +Do not assume all empty screens can share `[]` or `null`. Client code may branch on sentinel IDs, counts, active/inactive state or specific response structures. + +This is one of the areas where **observed FIFA 17 client behavior takes precedence over generic API cleanliness.** + +--- + +# 39. Dynamic / Conditional Hub Presentation + +The FIFA 17 interface visibly includes state directly in tiles. + +Examples seen in archived screens include: + +**Single Player Season — DIV 10** + +**Draft entry count/state** + +**Team of the Week — NEW / active challenge** + +**Online Season — DIV 1** + +**FUT Champions — rewards ready to be claimed**. + +Therefore the hub must be viewed as a projection of underlying state: + +`rendered tile = static tile identity + dynamic server/account state`. + +Do not hardcode every tile label as immutable artwork. + +--- + +# 40. Recommended OpenFUT Domain Separation + +For implementation, these are useful conceptual domains even if the exact code modules differ: + +|Domain|Owns| +|---|---| +|**Club/Profile**|name, badge, record, currencies| +|**Inventory**|owned item instances| +|**Squads**|active/stored/concept squads| +|**Store**|pack offers and promotion availability| +|**Packs**|entitlements, generated content, opening| +|**Unassigned**|unresolved item instances| +|**Transfer Market**|listings, bids, targets, settlement| +|**Consumables**|item application| +|**SBC**|groups, requirements, submissions, rewards| +|**Seasons**|division and 10-match progression| +|**Tournaments**|knockout progression| +|**Draft**|paid entry, temporary squad, four-game run| +|**FUT Champions**|qualification, Weekend League, ranks/rewards| +|**Friendly Seasons**|friend head-to-head season| +|**Live Content**|TOTW, promos and changing challenges| +|**Manager Tasks**|tutorial progression| +|**Leaderboards**|calculated ranking views| + +This separation is not a claim that EA's original server was organized identically. It is a recommended domain model that reproduces the **observable FIFA 17 behavior** documented above. + +--- + +# 41. Agent Priority Order + +For fidelity work, the agent should prioritize behavior in this order: + +**First:** make every tile route to the correct screen without crashes, bounce-back or unavailable dialogs. + +**Second:** make all read-only state accurate: Coins, record, division, squad, inventory counts, pack availability, auction state, progress. + +**Third:** make the explicit mutations transactional: pack purchases, quick sells, consumables, transfers, SBC submissions, Draft entries and claims. + +**Fourth:** make the resulting state propagate across the entire hub. + +**Fifth:** implement mode progression such as Seasons, Tournaments, Draft and Champions. + +**Sixth:** reproduce historical live-content details and cosmetic/dynamic promotional behavior. + +--- + +# 42. What Is Historically High Confidence + +The following should be treated as established FIFA 17 behavior rather than speculation: + +The Single Player hub contains Season, Tournament, Draft, SBC and Team of the Week. + +The Online hub contains FUT Champions, Online Season, Online Draft and Friendly Seasons on the PC/PS4/Xbox One version. + +Seasons are ten games with Division 10→1 promotion/hold/relegation progression. + +Friendly Seasons are five-match friend seasons. + +Tournaments are four-round knockout competitions. + +Draft uses temporary non-owned players, four-round elimination and result-based rewards; standard FIFA 17 entry was 15,000 Coins / 300 FIFA Points. + +SBC consumes the submitted squad in exchange for configured rewards. + +Concept Squads may use any FUT player without granting ownership. + +Transfer Market supports filtering, Bid, Buy Now, Transfer Targets and Transfer List. + +Transfer sales incur the historical 5% FUT tax. + +Store contains regular packs plus temporary promotions, while packs can also be granted as mode rewards. + +My Club contains players outside the current squad, consumables and other owned items. + +Club Items include Badge, Home Kit, Away Kit, Ball and Stadium. + +FUT Central exposes Manager Tasks, with fourteen tasks in FIFA 17 and a final Premium Gold Pack reward. + +TOTW is an active squad that can be challenged in FUT. + +FUT Champions connects weekday knockout qualification, Weekend League competition, rankings and claimable rewards. + +--- + +# 43. What Should Still Be Learned From the Client + +The agent should **not invent** any of the following purely from this document: + +exact internal FIFA 17 route names + +exact Blaze/HTTP request sequencing + +exact response-field names + +exact sentinel IDs + +exact server flags controlling tile availability + +exact empty-state payload structures + +exact tournament/live-content IDs + +exact Central promotional tile feed + +exact error codes/dialog mappings + +exact state-refresh request sequencing after every mutation. + +Those belong to protocol reverse-engineering. + +The correct development rule is: + +**Use this document to know what the player-visible result must be. Use captures/client analysis to learn the exact protocol required to produce that result.** + +--- + +# 44. Canonical Hub Flow Map + +The overall experience can be summarized as: + +```text +ENTER FUT + | + +--> FUT CENTRAL + | +--> Manager Tasks + | +--> live/account information + | + +--> SINGLE PLAYER + | +--> Season ----------> Match ---> progression/rewards + | +--> Tournament ------> Match ---> bracket/rewards + | +--> Draft -----------> Draft Squad -> matches -> rewards + | +--> SBC -------------> build -> submit -> consume -> reward + | +--> Team of the Week -> challenge -> match + | + +--> ONLINE + | +--> FUT Champions ---> qualification/WL/rank/reward + | +--> Online Season ---> matchmaking -> match -> division + | +--> Online Draft ----> Draft Squad -> online matches + | +--> Friendly Seasons -> friend -> five-match season + | + +--> SQUADS + | +--> Active Squad + | +--> My Squads + | +--> Concept Squads + | + +--> STORE + | +--> Browse Packs + | | +--> Bronze + | | +--> Silver + | | +--> Gold + | | +--> Promo + | | + | +--> purchased/reward pack + | +--> Open + | +--> Reveal + | +--> New Items + | + +--> TRANSFERS + | +--> Transfer Market + | | +--> Search + | | +--> Compare Price + | | +--> Bid + | | +--> Buy Now + | | + | +--> Transfer Targets + | +--> Transfer List + | + +--> MY CLUB + | +--> Players + | +--> Staff + | +--> Club Items + | +--> Consumables + | + +--> LEADERBOARDS + | + +--> UNASSIGNED + +--> Keep/Send to Club + +--> Transfer List + +--> Quick Sell +``` + +The important point is that arrows crossing between these branches are intentional. + +A Store item becomes a Club item. + +A Club item becomes a Transfer listing. + +A Transfer purchase becomes a Club item. + +A Club item becomes an SBC submission and disappears. + +An SBC becomes a reward pack. + +A reward pack becomes New Items. + +New Items become Club inventory. + +Club inventory becomes an Active Squad. + +The Active Squad enters matches. + +Matches change competition progress and economy. + +Competition progress creates rewards. + +Those rewards return to the Store/pack/inventory loop. + +That interconnected loop is the actual behavioral core of FIFA 17 Ultimate Team. + +--- + +# 45. Final Directive to the Implementation Agent + +When implementing a FIFA 17 FUT route, **do not ask only “does the request return successfully?”** + +Ask: + +**What tile did the player select?** + +**What screen is FIFA 17 trying to render next?** + +**What state is that screen supposed to show?** + +**Is this operation navigation or a mutation?** + +**If it mutates state, which other FUT screens must immediately reflect that mutation?** + +**What happens if the collection is empty, the event is expired, the user is ineligible, the item is untradeable, the bid loses, the player has no contracts, or the reward is already claimed?** + +A route should be considered functionally complete only when the actual FIFA 17 client can travel through the full player-visible workflow and return to the hub with coherent updated state. + +That is the fidelity target. + +--- +--- + +# Cross-check against OpenFUT as built + +Added by the implementation agent on 2026-08-17. Everything above this line is the +external document verbatim; everything below is repo-grounded annotation. +Tags: **[CONFIRMED]** observed in this repo/prod, **[CONFLICT]** contradicted by the +oracle or the recovered client tables, **[GAP]** not implemented (actionable), +**[UNVERIFIED]** plausible but never observed here — needs a capture before code. + +## Where the document and the implementation already agree + +- **§36 navigation vs mutation — [CONFIRMED].** The host runs an economy barrier + (`try_handle_economy` / `classify_economy` in `openfut-utas-host/src/lib.rs`) + *before* generic route classification, and every migrated read is side-effect + free. This is the design the document argues for, independently arrived at. +- **§38 empty states are feature-specific — [CONFIRMED], and stronger than stated.** + Container type is load-bearing on the wire: `/marketdata/pricelimits` is a bare + **array** while plain `/marketdata` is an **object**; the flag-off family + (`season`, `tournament`, `champion`, `clubUser`, `user/list`) returns `{}`. + The oracle's own comments record past client freezes from object-where-array. + "Do not assume all empty screens can share `[]`" is not a style preference here — + reversing one is the documented freeze class. +- **§14 squad slots reference owned instances, not definitions — [CONFIRMED].** + Core stores opaque owned-card ids; the FIFA identity store maps wire id ↔ + instance; squad writes reuse the adapter's `parse_squad_put` / `build_squad_write` + so the import path byte-matches the live path. +- **§6 SBC must be destructive and atomic — [CONFIRMED, recently hardened].** + `submit_sbc` de-duplicates submitted ids (`HashSet`) and caps at + `MAX_SBC_CARDS = 30`; coin/claim paths use single-statement compare-and-swap + (`UPDATE … WHERE id = ? AND coins >= ?` + `rows_affected`). Residual + multi-statement partial-failure edges are tracked in `docs/CORE_CORRECTNESS_ISSUES.md`. +- **§23 a listing is an object, not `(item, price)` — [CONFIRMED].** `listings` + carries state / start / buyNow / owner plus a full shaped-card snapshot + (`item_json`), so a transfer-pile row renders without re-resolution. +- **§27 untradeable items must not enter the listing flow — [CONFIRMED as a bug we hit].** + `shape_item` hardcoded `"untradeable": true`, which greyed out *both* list + buttons; owned instances now report `false` while the item-definition route keeps + `true`. + +## Where the document is wrong for FIFA 17 as we have observed it + +- **§32 "eight consumable families" including Manager League — [CONFLICT].** + Against the recovered client tables (`docs/CARD_TAXONOMY.md`, verified against + the `.105` `fcc_*.json`), the Python oracle ships 8 core kinds and + *deliberately excludes* `manager_league` (category 10) along with + `formation_mod` / `manager_formation_mod`. Do not add Manager League to the + consumable overlay on this document's authority. +- **§32 the Apply-Consumable transition — [CONFLICT / does not exist upstream].** + Consumables are a **read-only synthetic overlay** (id base 940000000), never + written back to the save and never decremented. There is **no** apply / fitness / + healing / training / position / chemistry endpoint in the oracle at all. The only + real owned-item mutations upstream are Quick Sell and Move/pile. So + "Apply Consumable" is *new behaviour requiring a captured route*, not a port — + which is exactly what the document's own §43 forbids inventing. + +## Gaps this document usefully exposes (ranked by value) + +1. **§27 "sent to the Transfer List but not currently listed" is a REAL state — [GAP].** + This is precisely the limbo hit on 2026-08-17: our `/tradePile` renders only + `active` listings, so keying the `/club` exclusion on the `trade` *pile* + stranded 4 cards in no screen at all. Commit `f2c4927` fixed the symptom by + keying exclusion on the **active listing** (self-healing). The faithful fix is + to represent unlisted trade-pile items in `/tradePile` — **blocked on the wire + spelling of that state**; do not guess a `tradeState` value. +2. **§20 pack output belongs in Unassigned / New Items, not straight into the club — [GAP].** + Our 29-item `purchased` pile *is* that state and is currently rendered inside + `/club`. This directly informs the open decision on excluding `purchased`: + the document argues for surfacing it as a conditional **Unassigned** node + rather than silently folding it into club inventory, and warns against + reporting zero unassigned items just because the reveal call succeeded. +3. **§25 the 5% transfer tax — [GAP / UNVERIFIED here].** Not implemented; our + single-account synthetic market credits no seller, so there is no sale to tax + yet. Confirm the oracle's behaviour before adding an economy sink. +4. **§2 Manager Tasks as durable progress flags — [GAP].** Not implemented in any + form. Would need both a progress store and the Central widget protocol + (explicitly unarchived per the document's own fidelity warning). +5. **§24/§26 Bid and Transfer Targets — [GAP].** Only Buy Now / list / cancel + exist; there is no bid, no high-bidder, no outbid/won/expired target states. +6. **§33 Leaderboards — [GAP].** Still Python-proxied and on the deferred tail + (`docs/PYTHON_RETIREMENT_PLAN.md`). + +## Standing caution for future agents + +The document's §41 priority order ("first make every tile route without +bounce-back") matches how the real defects surfaced here: the transfer-market +break was four independent contract bugs that each returned HTTP 200. **A 200 is +not evidence.** The verification that actually caught them was a live FIFA client +plus field-for-field comparison against the Python oracle — which is why the +differential harness now compares the whole `tradePile` auction record rather +than just its length and `tradeState`.