Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.
External roster loading and direct match launch — development46
Current extension: Match controls51 completes the three planned additions: game-clock rotation intent with native entry observations, original native timeout calls and connected-input/team assignment.510 Windows API tests/84 schemas and focused live52w/52za/52x pass; multi-controller physical input remains unverified because no gamepads are available. This closes the planned match-control implementation, with that hardware verification outstanding. Presentation, broad modding/rule semantics and public packaging remain separate. The earlier evidence/version paragraphs below remain their recorded checkpoints; consult the new ledger for current implementation and exact limits.
October17,2026. This extends the development37 preparation milestone through the public API. API0.2.0.dev46/HTTPv1 supports snapshotABI21, retaining eventABI4/collegeprofile4/courtdefinition3. The native simulation remains the original Windows x86 game. Public preview2 remains36/ABI14; stable35 and the95 original saves are preserved. This integration is private development work, not a newly published package.
Current launch expansion adds per-launch original/college rules,264 startup preset values, pre-play identity/metadata and owned cancellation. All264 presets pass readback before reveal and after natural entry into gameplay. Optional shared writer authoring passes live file-edit/lineup-to-game. Single-use request documents, native startup cameras and primary-side/CPU participation are implemented; current exact acceptance/pending cases are in the expansion ledger. API46 supplies verified binary ROS export and a no-overwrite SDK download. Normal broker exit leaves its child open; use guarded session.stop for explicit owned-process cancellation/completion.
Use the app-owned request guide for one-document process startup, per-child college/original rules, presets/camera/primary participation, optional authoring and pre-tip identity binding. The lower-level HTTP flow below remains available to every client.
Client workflow
Any independent dynasty/career tool can supply a standalone ROS, select participants/uniforms/arena/playbooks and all nine Game Options entries, then issue Start. No first-party database or mode runner is required. Starting order and native minute preferences are authored into a separate ROS with the independent writer. Minute preferences do not guarantee an exact substitution schedule.
- Run the matching broker in the signed-in Windows desktop session. Attach with
--pid, or opt in to process startup:
powershell
python -m openhoops_api --launch-game "C:\Games\OpenHoops\nba2k14.exe" --state "C:\OpenHoopsState"
The chosen working game must already have the matching complete ABI21 hook; x64 _atomic.dll must be beside the broker source. Native startup skips opening/title waits without input and keeps managed preparation/loading covered until the requested match. Normal EXE startup opens Quick Game directly. See native startup and app branding. SSH/service session0 is rejected. Normal broker exit leaves the game open; the owning application controls its lifetime.
2. Wait for GET /v1/launch health ready. bootstrap reports optional desktop-startup status; startup generates no keys; an attached broker does not reroute its existing game. Stale frames remain ineligible for game commands.
3. Upload bytes with authenticated PUT /v1/rosters/<lowercase SHA256> and application/octet-stream, one Content-Length and no Transfer-Encoding. Alternatively POST /v1/rosters with exactly {path, sha256} imports an absolute local ROS. Both create an immutable content-addressed copy in the private broker state. GET /v1/rosters/<SHA256> reads admission metadata. native_loaded:false means this response is intake metadata, not current game state.
4. Acquire the normal control lease. Send roster.load with roster_id, exact run_id, expected_launch_revision, preparation expected_revision and catalog_id, plus the normal command/client/lease fields. Roster replacement requires inactive Home; managed launches prepare there under the loading cover. Loading from the active Quick picker is rejected before native mutation because expanded roster replacement exposed a native UI null read. The original decoder, reset and selection tail run on the game thread. Applied means counts were read back; /v1/launch supplies the loaded SHA identity and counts.
5. Read fresh preparation/catalog identities after loading. Apply the 13 controls. Row IDs are physical rows in this exact roster/catalog; external identities are separate. Choose teams before uniforms, then arena/playbooks. Quarter length is1–12minutes. Per-launch college halves1–20, scaled OT and fixed TV scheduling can be supplied with --match-config, overriding the exe-local INI only for this child.
6. Send match.start with the same launch preconditions and the verified loaded roster ID. The adapter invokes the original ordinary-exhibition factory and loading-screen transition directly from Home or team selection. No team-selection navigation is required. Applied means the native loading transition occurred, not that assets/gameplay have completed loading.
The SDK supplies wait_ready, load_roster, start_match and launch_match. The launch example takes a ROS, a JSON object of preparation values and an unused receipt path. Omitted values retain fresh loaded/current defaults. Supply all13 for a fully specified matchup. Commands use60-second client timeouts and preserve recovery IDs. Earlier steps can remain applied if a later step fails; this is not an atomic transaction.
Repeat the exact original command ID/body to retrieve its durable receipt. On an unconfirmed/lost reply inspect /v1/commands/<id>; never blindly repeat Start with a new ID. Active/loading games, stale revisions, wrong roster/catalog ownership and unsupported contexts refuse commands. Native guards repeat the checks on the game thread. Private managed paths never enter public command receipts or original persisted request bodies.
Admission and limits
Accepted standalone sizes are2672672 or16777248bytes, schema501551AE/kind5. Checks include exact SHA/CRC/declared size, section counts/record framing, text/logical bounds, paired playbooks, key team references and the graphics-ID10/25 defaults used by native reset. Expanded files require the opt-in native capacity hooks. Current preparation admits2–2048teams,1–65535players/uniforms and at most128arenas/playbooks. These are finite admission bounds, not maximum-size gameplay certification. Existing16MiB/twoMiB-text/row-handle/roster-slot limits remain.
Admission does not certify every field, game mode or custom asset. No community roster/custom art is available. Invalid but structurally admitted native content can still fail; after any decoder fault the outcome is indeterminate and the isolated process should be inspected/restarted. Source files and original saves are never used as output destinations by intake.
Managed phase4 pre-play binding is implemented with loaded-hash, slot/name, full-clock and zero-stat guards; legacy phase10 binding also remains; the session client consumes live data and durable reconciled results, with independent consumers/idempotent ACK. Earlier-event completeness is not claimed. Legal possession/live/dead-ball authority, universal event meanings, arbitrary callbacks and safe asset hot-swap remain unavailable. Native uniform menu previews can lag; actual gameplay selection has separate evidence. Physical device selection/multiple humans, custom in-game presentation and disk settings persistence remain separate. No new full-game, rare-rule, physical-ultrawide or public-release claim is added here.
Current startup verification
The expansion ledger records current46/ABI21 identities,440 Windows tests and scoped live acceptance. Development39 retains the earlier native Quick/inputless managed launch/branding evidence and Home-only roster replacement restriction. The development38 results below are historical evidence, including its replaced guarded-input bootstrap.
Historical development38 verification
345 Windows API tests pass on exact45r API source. Non-probe native45m compiles with MSVC19.51 /W4 /WX; its source is byte-identical in45r. ABI16 is67608bytes, appended after the65416-byte ABI15 prefix; launch state/command sizes64/2128 are compiled assertions and Python tests.
Frozen45r implementation archive SHA099433229d7ec4d9f8b8524e396599bbe2bcd63262a86e6e50e223fc17637a46; manifest. Native DLL6260d5df577082adb233dc3a7c652c413c1f15a9b3f692fc239a29980e035d7e. Public source/archive hosting is unchanged.
Stock45g directly loaded PreparedStock SHAf21e3c4eef15d92ba282248c5e90ab5f985ccb03f30876eccf86cf12a344d02c from Home:105teams/1665players/579uniforms. All13 requested values passed; native Start entered presentation and then phase10 without further input, clock240→129.4605, zero adapter errors, requested Hawes/Ridnour starter changes and alternate uniforms. Duplicate load/Start commands returned original receipts. Load, preparation, Start, running.
Fresh45r used the public --launch-game broker and independent launch_match SDK with no research input task or manual interaction. Bootstrap completed with two guarded acknowledgements. Prepared905 SHA971c764f4aa49b43751538b5f8b5bb0e0b01dda6d04f8dfd3392be130811ee72 loaded905teams/13665players/3779uniforms; all13 choices applied, including final teams903/904, uniforms3771/3776, arena18 and books18/23. Native Start skipped team-selection navigation. First valid phase4 snapshot matched all ten requested starters, zero errors, half180/OT60/shot30 despite generic quarter5. Full workflow, rendered play, native preferences. Every stored roster slot and four32/10-minute preferences match native memory. This is startup/early play, not a new full-match/export certification.
39 schemas validate live intake/launch/preparation/snapshot/receipts and15 actual journaled command bodies, missing-precondition rejection and unchanged historical results. 345 tests use exact45r imports. Earlier45p additionally reached phase10 with advancing half/shot/backcourt clocks and zero errors.
Generated-team spectators/staff render pink materials in the accepted screenshot. The earlier manually started44e fixture shows the same issue, so it predates direct Start. Matching custom crowd/team art is not supplied or verified; asset compatibility remains open. Stock45g renders ordinary crowd materials. This does not establish a general custom-asset loading contract.
Rejected attempts remain in analysis/match-launch45:45f used the wrong decoder offset/table count and returned indeterminate; corrected stream begins at offset24 and uniforms are section26. Early45g calls before Home refused, with no native load claimed.45h exposed Windows unread-upload-body rejection losing its HTTP response; the drain fix passes.45k omitted the intro descriptor;45m exposed movie-frame staleness in bootstrap.45p uses a bounded owned-process screen observation while all game commands retain freshness requirements; its90-second deadline reported failure before initialization later reached Home unaided.45r allows up to240seconds for bootstrap and300seconds for SDK readiness; neither timeout permits keys outside recognized startup screens.45k watchdog closure initially used a process-name argument instead of -Id; explicit ownership-checked recovery closed both processes, and later watchdogs correct it. Failed captures/logs retain their original contents.