From 63f02c4fb1a22b4e3fffc70f3ebbb317af7fe466 Mon Sep 17 00:00:00 2001 From: funman300 Date: Wed, 12 Aug 2026 18:41:24 +0000 Subject: [PATCH] =?UTF-8?q?docs(state):=20Slice=207=20=E2=80=94=20FUT=20sq?= =?UTF-8?q?uad=20read+write=20retail-validated=20on=20FIFA=2017?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record the staged retail A/B: FIFA consumed the Rust squad path end-to-end (userMassInfo overlay, in-game swap -> squad-replace {"id":0}, formation f442->f433 persisted to Core, cold relaunch returned the persisted squad), with Python rollback / Rust re-enable proven by host-log presence. Note the OPENFUT_DEV_CONTENT_GAMES=fifa17 startup requirement (silent empty /collection if omitted) as a needed deployment/preflight assertion. --- docs/PROJECT_STATE.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index 3299c51..26d03bc 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -104,6 +104,26 @@ Last compiled from repository evidence during context initialization. (sometimes bulk `count=100`) — Core honours `offset` and terminates; the My Club UI nests team under league; the "~1900" club counter is Python `userMassInfo`, not `/club`. Remaining is operational only (promote the staged stack to a durable deployment). +- **Slice 7 (2026-08-12): FUT squad authority (read + write) RUNTIME VALIDATED on retail FIFA 17.** + Staged operator-assisted A/B (`.105` retail client → `.120`, source-scoped utas switch + `:8099→:8199` into `openfut-utas-host` over a staged `615c5fd` Core seeded by `seed-dev` with the + dev 33-card inventory). FIFA itself consumed the Rust squad path end-to-end: FUT boot served + `RUST_OVERLAY userMassInfo` (squad overlay) and the squad screen rendered the dev XI; a controlled + in-game squad edit issued `PUT …/squad/0` → host `squad-replace` → Core → `{"id":0}`; an in-game + formation change f442→f433 persisted to Core (canonical fingerprint changed, `position_index` + remapped 0–10); a FULL FIFA relaunch cold-fetched and rendered the persisted f433 squad (no client + cache). Reversibility proven on the exact client path by log presence, not response data (both + backends coincidentally hold the same dev squad — the Python oracle `fifa17_profile.json` was + seeded from the same `squad_put_f442.json` capture): disarmed `.105:8099` reached Python (absent + from host log), re-armed reached Rust (`route=club limit=Some(9)` present); the persistent identity + store survived the cycle with 0 reallocation. Non-migrated routes (`/ut/auth`, `account/sync`, + `accountinfo`, `settings`, `hub`, store txn) correctly Python-fallback. NEW startup requirement: + the Core server loads dev card defs only for games in env `OPENFUT_DEV_CONTENT_GAMES` (comma-sep); + omitting `fifa17` makes `get_collection` silently drop every owned card (empty `/collection`, + "no squad") despite a successful seed — MUST become a deployment/preflight assertion. Preceded the + same day by a staged two-process parity gate (real Core+host over HTTP, no FIFA) confirming byte- + shape parity of `userMassInfo.squad` vs the captured oracle. Next milestone: real-data Core + import / profile strategy → production Rust UTAS. Blaze deferred. ## Stubbed / planned