diff --git a/openfut-utas-host/ROUTE_AUTHORITY.md b/openfut-utas-host/ROUTE_AUTHORITY.md index cb9846d..6ccf04b 100644 --- a/openfut-utas-host/ROUTE_AUTHORITY.md +++ b/openfut-utas-host/ROUTE_AUTHORITY.md @@ -80,19 +80,30 @@ audit source; the host `classify()` is the enforcement point (NEVER BOTH). ## Cutover progress (2026-08-13) -Landed (Core authority + transport + first reader; classifier NOT yet flipped): +Landed (Core authority + transport + several handlers; classifier NOT yet flipped): -- **Core economy HTTP API** (`d32dc6e`): generic `/economy/{balance,entitlements, - purchase-entitlement,redeem-entitlement,sell-item,grant-reward,purchase-item}`, - server-side club resolution, atomic transactions. Core matrix green. -- **Host `CoreEconomy` client** (`d240a61`): typed reqwest transport, **fail-closed, - no Python fallback** by contract. -- **`/user/credits` handler** (`handle_credits`): Core-backed, oracle-shape body, - 503 fail-closed. Tested via `FakeEconomy`. +- **Core economy HTTP API** (`d32dc6e`, `bcc4f51`): generic `/economy/{balance, + entitlements,purchase-entitlement,redeem-entitlement,sell-item,grant-reward, + purchase-item,purchase-items}`, server-side club resolution, atomic. Import now + seeds `unopenedPackIds`→entitlements. Core 178 tests green. +- **Host `CoreEconomy` client** (`d240a61`): typed reqwest, **fail-closed, no + Python fallback** by contract. +- **Reader handlers**: `/user/credits` (`handle_credits`), `/store/purchasegroup` + full-gen (`handle_purchasegroup`, no Python body dependency), `userMassInfo` + economy overlay (`overlay_massinfo_economy`). Invariant test: all three read one + Core state. +- **Writer handler**: `/match` reward (`handle_match_end` → Core `grant_reward`, + oracle `destroy_match_body` shape). +- **Adapter policy mappers** (`181bd94`): match reward, pack price. +- All Core-backed, fail-closed (503, never Python), `FakeEconomy`-tested. **Not flipped:** `classify()` still routes every economy route to Python. Per the single-writer rule the flip is one coherent barrier once ALL writers+readers are -implemented and Core is seeded — a partial flip would desync coins. Remaining -handlers: purchasegroup full-gen, userMassInfo economy, Store BUY, pack-open, -quick-sell, market buy/list/cancel, match reward; then the barrier flip + -differential/concurrency/restart + no-fallback classifier tests. +implemented and Core is seeded — a partial flip would desync coins. + +**Remaining before barrier:** Store BUY, pack-open, quick-sell (need item-wire +shaping via `club_response` shapers + `openfut-identity` numeric ids + pack-content +policy); market listing durable state + list/cancel/buy; move-items metadata; +Core-backed adapter live wiring (retire in-memory `ProfileEconomy` from prod path); +`openfut-economy-import` CLI; differential harness + concurrency + restart; then the +classifier barrier + no-Python-fallback classifier tests.