Files
OpenFUT/docs/evidence/live-captures-2026-08-15/README.md
T
funman300 0bc71dbd74 docs(evidence): capture full-length UTAS responses + userMassInfo envelope
Fix extractor truncation (bound each HTTP message by Content-Length): userMassInfo
(8 KB) and purchasegroup responses are now complete in the committed corpus, not
cut at 4 KB. Document the userMassInfo envelope contract (target shape for a future
full-Rust migration; needs the clubAbbr/established account triad Core lacks).
2026-08-17 04:13:55 +00:00

3.5 KiB

Live UTAS wire captures — 2026-08-15

Fresh sanitised FIFA 17 UTAS wire, captured during the post-P1 staging A/B on a real FIFA 17 client (10.10.0.105) driving the isolated post-P1 candidate backend (10.10.0.121, host bin fda40d12, Core fbb54ea). Production untouched.

This rebuilds the primary-capture corpus that was lost to .gitignore (Known Issues #200 / "take sanitised captures on the next live FIFA run and commit them").

Files

  • utas-requests.sanitised.txt — 10 real client requests (----separated).
  • utas-responses.sanitised.txt — 12 responses.

Captured with tcpdump on the container netns (UTAS is plain HTTP on :8099), reassembled + split + sanitised by openfut-staging/extract_http.py. Redacted: X-UT-SID/sid (<SID>), authCode (<AUTH>), deviceId (<DEV>), macAddress (<MAC>), and any 32+char hex token (<TOKEN>). The raw .pcap is intentionally NOT committed (it is unsanitised).

Route contracts captured (verbatim shapes)

POST /openfut/account/sync (launcher control-plane, Python-served)

Request (launcher → backend):

{"personaId":33068179,"personaName":"CAGE","level":1,"experience":0,
 "experienceMax":1000,"accountFunds":0,"accountFundsCap":100000}

Response:

{"account":{"personaId":33068179,"personaName":"CAGE","clubName":"OpenFUT",
 "clubAbbr":"OFC","level":1,"experience":0,"experienceMax":1000,"accountFunds":0,
 "accountFundsCap":100000,"profilePath":"accounts/33068179/fifa17_profile.json",
 "coins":29826776,"unopenedPacks":0},"status":"OK"}

NOTE: coins here is Python's STALE profile value (29,826,776) — Core's authoritative balance at capture time was 29,859,876. The launcher's AccountSummary parser is lenient and requires only {personaId,personaName,level,experience,accountFunds,coins, unopenedPacks} (clubName/clubAbbr/etc. ignored). BLOCKER for a Rust migration is NOT the shape — it is that Python account/sync also selects the active profile the still-Python-served userMassInfo envelope depends on, so it is coupled to the userMassInfo hybrid and cannot migrate standalone.

GET /ut/game/fifa17/store/purchasegroup/all?ppInfo=true (empty My-Packs sentinel)

The mypacks group carries the synthetic sentinel pack when My Packs is empty:

{"assetId":65534,"displayGroup":{"priority":1,"value":"mypacks"},"id":65534,
 "packType":"GOLD","packContentInfo":{"goldQuantity":0,"itemQuantity":0,...},
 "state":"active","unopened":false}

Client renders empty My Packs AS Browse Packs (no crash) — the bug-6c resolver guard.

GET /ut/game/fifa17/userMassInfo (RUST_OVERLAY hybrid, full 8 KB envelope captured)

The complete envelope is in utas-responses.sanitised.txt: root pileSizeClientData + userInfo (with clubName, clubAbbr, established, accountCreatedPlatformName, currencies [Core coins overlaid by Rust], won/draw/loss, clubNameChangeAllowed, divisionOffline/Online, purchased, feature, reliability, bidTokens, trophies, sessionCoinsBankBalance, actives, squadList). Field spec is authoritative in fifa17-recon/tools/utas_server.py::user_info(). This is the target shape for a future full-Rust userMassInfo (needs the clubAbbr/established account triad, which Core lacks).

Other captured request lines

POST /ut/auth, GET user/accountinfo, GET settings, GET phishing/trusteddevice, PUT match/reset, GET userMassInfo, PUT clientdata/userHubData, PUT /ut/v2/game/fifa17/store/transaction/0.

See openfut-staging/p1p-live-2026-08-15/AB_VERDICT.md for the full A/B result.