Files
OpenFUT/docs/FIFA17_HUB_BEHAVIOR_SPEC.md
T
funman300 ae5feb05b7 docs: record the external FIFA 17 FUT hub behavioural spec + cross-check
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.
2026-08-17 18:25:23 +00:00

45 KiB

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:

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 /tradePileblocked 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.