OPENHOOPS / 2K14Final team archive · November 9, 2026Reference libraryChecksums

Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.

Roster capacity investigation

Updated October16,2026 UTC (October15 locally). The opt-in Windows prototype now has an independent roster editor and passes combined native load, game save and fresh-process reload with 906 teams,13,680 players and3,790 uniform records. This preserves105 original teams, adds800 teams with15 separate assigned player records/four uniforms each, and imports another team with15 players/all11 uniforms. The12,000 new cloned name pairs are distinct synthetic names; stock artwork/attributes remain templates.

Editable arenaA uses743,714 bytes of a1,048,576-byte capacity across six chunks. Primary backing remains16MiB; configured AmaximumtwoMiB has compiled boundary evidence, not a maximum-size live pass. Native37bx remains unchanged with 196 compiled checks. The current public editor0.1.0.dev7 passes101 Windows tests on its own catalog/runtime; earlier dev6 evidence remains separately scoped. The dev4 writer regeneration matches the game-saved combined meaningful bits, including the derived boost collection; CRC and unused padding/tail differ. See the editor verification ledger and preservation receipt.

The earlier905-team capacity verification remains the separate source of last-team gameplay and uniform-preview observations. That fixture showed template names in Quick Game previews and a reused-art crowd issue; no complete custom-art or all-game-mode certification is claimed. Fifteen stored players and twelve active players observed in that older NBA match remain separate facts.

Public API versions/capabilities and stable35 are unchanged. The subsequently requested hosted Windows preview now includes the independent editor and a fresh combined hook. Earlier candidate archives remain unchanged. All95 original saves, stable DLL/EXE, original corpus, settings backup, SSH configuration and independent artwork hosting were preserved; owned research games/debugger/editor workers are stopped. Existing RED MC/Sigil extended-file compatibility, real affected-roster acceptance, career/IFF workflows and full editor parity remain open. Reported365/8000/850 counts were not proven independent row caps. Other finite representation limits are recorded in the editor ledger.

The sections below retain the investigation's checkpoint chronology. Pending items at an earlier checkpoint are superseded by the later acceptance results and this current summary.

Confirmed separate constraints

  • Original primary roster backing/import capacity is 0x28c800 bytes. More records can exceed this independently of text. The original parent also contains inline settings/controller objects; increasing its inline offsets indiscriminately corrupts those objects.
  • Editable text arena A has stock capacity32000 UTF-16BE characters (64000 bytes). Arena B is separate; the stock file uses63944 characters there. Text handles contain a16-bit section identifier and16-bit character offset. The original native resolver honors the declared A capacity; controlled original-instruction roundtrips passed with65535 characters (131070 bytes).
  • Doubling arena A alone does not make names unlimited. The initial short-name fixture fit a 16-bit offset; the later full-name fixture required the bounded text-chunk extension documented below. A compatible editing workflow remains open.
  • The native file menu has a separate serialized-size admission check. Its size getter is also used by exhibition/career containers. A research revision that changed the getter globally prevented selection of ordinary saves; revised adaptive serialization restored a live successful stock-roster load.

Prototype and evidence

OPENHOOPS_ROSTER_RESEARCH plus exe-local openhoops/roster-research.ini gates private research source. It allocates independent16MiB primary backing before original codec initialization, preserves original parent offsets, guards exact original instructions and retains original record codecs. The original import CRC now hashes the zero-padded destination to avoid reading beyond smaller stock IFF input. Public API versions/capabilities have not changed.

The independently built Capacity800 fixture contains12800 players,800 teams and3359 uniform records. It preserves original populated sections, adds695 teams with15 distinct assigned players each and four uniform records each, and reuses stock uniform artwork. Arena A capacity65535/used60543 characters exceeds the original64000-byte text range. This is a capacity fixture, not a finished real roster or new artwork. Dell fixture: roster-capacity37a/fixtures-h/Capacity800.ROS, SHA256 a6457363146761a79523ec25cd4acae7a999b231e2db1723d6183f4227daa55a. Builder and independent audit retain originals and refuse destructive output paths.

Corrected37r DLL d2f4315149a7c11d13609c38ce44922b3f50b61fd5142fdc175855a7bada07bc passed67 compiled/original-instruction checks. Its live isolated37s run successfully loaded stock Roster1, but Capacity800 produced “data is corrupted”; runtime counts remained stock. That revision did not pass800-team load; the later37bt load result below supersedes that gate. Save/reload, gameplay and REDMC/Sigil compatibility remain unverified. The native schema signature matches the fixture (0x501551ae).

Nine original header-validator checks subsequently passed offline on the Dell: stock and expanded files validate with their full byte counts; short bounds, altered CRC and altered schema are rejected. Original x86 validation/schema selection executes; imported byte swapping and CRC use named argument-based mocks. The later37aa live observer confirmed a stock-size read bound for the expanded file; see the loader finding below. Further research observer37z (6309acc02cbe82be9b1f3aeff827b6b298eb8c3761c44c099511423b61ac0cb6) passed72 compiled checks, including original-call-frame preservation at all four stack alignments. It records actual validator inputs without bypassing validation. Isolated37aa PID8924 supplied the live observation below and closed by explicit owned stop at20:03UTC. Automated console-free input advanced title and menus without user intervention. Single Enter was not repeatable on fresh37ap; two closely spaced Enter pulses in isolated windowed mode reached Home on fresh37ax/37bq. See desktop evidence and command; fullscreen reliability and timing root cause remain unproven.

The user-proposed Reset Roster route did not load the isolated Capacity800 alias; stock counts remained. Archived JaoSming instructions describe Reset Roster as reloading roster.iff. The compressed original IFF is not a ROS image and must not be overwritten with one. Settings are also exe-local in this setup (saves/Settings.STG, Config.cfg, My Profile.USR); there is no demonstrated AppData permissions defect.

The independent fixture audit is retained separately from live acceptance. Source37z archive SHA256 f3fff939e1b128389da0301769705cf2a3c1b9153c7e1946fca02289bb4d7797 records133 exact native/API source files. All272 current API tests passed on the earlier37g staging; subsequent research changes have not changed the public Python API.

Runtime isolation and next evidence

Historical live research used Dell roster-game37j, separate from stable35 reference-game and its95 original saves. The October20 second cleanup retired this closed candidate into a verified restorable overlay, retaining every unique roster/save/configuration/DLL. Restore explicitly before replaying old scripts; the helper creates independent asset copies. Research stages/archives are internal evidence, not a new public release. The37s watchdog stopped its owned PID8804 at19:33:52UTC; closure receipt records a forced research stop, not a normal exit. Earlier37j PID520 exited around18:52:29UTC; cause remains unresolved, with no confirmed Windows crash event. Failed builds/analysis attempts remain evidence.

At this early checkpoint, expanded reading, persistence and practical full names were still open. The later 37bt/37bv/37bz/37ca results below resolve those tested gates. Editor integration and limits beyond the tested target remain open.

Confirmed listing read-size defect and next candidate

37aa observer recorded stock Roster1 available/declared2672672 bytes with matching CRC and successful load. Capacity800 declared16777248 bytes but received only2672672 available bytes; native validation rejected the short bound before CRC. The live file table assigned both ROS files the same2672664-byte outer payload. Original directory-listing instructions call the current serialized-capacity getter rather than keeping physical file length. This is a concrete reason for this prototype's load rejection, separate from text capacity.

Research37ao replaces only standalone ROS listing sizes with actual exe-local file lengths (minus the original8-byte outer offset). Filename/path, kind and instruction guards retain other original listing behavior; the standalone size gate and original CRC/schema validation remain active. DLL a33b665c9ad0b4f9435937fb235a7f1a8e61eb6825f82bb434ff51252deb36ef passed81 native checks; the actual-file-size Win32 body is a named mock in that frame suite. Internal source archive SHA c4a6917b8e528406fca1a1fdfdf9148f64b8f81087f2550619d3618ed3d18cd4 retains133 exact source files. Fresh37ap PID5296 closed by explicit owned stop20:23:44UTC after title input attempts failed. Windowed37ax PID10532 reached Home using paired Enter, successfully loaded stock Roster1 at20:34:12UTC and confirmed the listing fix: Capacity800 outer payload16777240 versus stock2672664. Expanded selection had no UI effect or header trace;37ax closed by its watchdog20:54:37UTC. Old exhibition/career container compatibility after an expanded roster is still unverified.

Confirmed temporary allocation failure

Research37bp DLL 8518bb78ae26a6e49aca8a519b95a7b5a4d10a2ae1d9657e6a6f9667a4ac7129 passed99 compiled checks. It adds read-only admission-result and allocation-result observers, preserving CPU/FPU/XMM state and native decisions. 37bq live log records at21:07:25UTC: expanded kind5/payload16777240 passes the size gate (value=1), then native temporary buffer allocation returns zero. No decoding occurs and counts remain stock. Closure records an explicit owned forced stop21:10:43UTC. The exact allocator rejection threshold/cause remains unproven; this observation establishes the null buffer for this expanded file.

The next source candidate supplies a private VirtualAlloc buffer only when that native allocation fails for kind5/exact expanded payload. It retains native file reading, CRC/schema and record decoding. Both original read-buffer cleanup calls distinguish the one owned private pointer from native allocations. DLL eb2c8c30f888e9b43bcd06d0595115b2c09d7a86968b44f24ad3efc217bb2fc1 passed126 compiled checks, including actual compiled ownership logic with named Win32 allocation/free sinks and both cleanup frames at all stack alignments. Internal133source archive SHA eb0e44d06d50d2a70e768e4e78a82d3bc3748de56facc06e4df8d85d53234373 is retained. Fresh37bt PID6212 started21:16:08UTC under a30-minute owned watchdog; live expanded acceptance remains pending.

Expanded native load passed; save path under repair

The37bs private read-buffer candidate passed126 compiled checks and fresh37bt loaded both stock Roster1 and Capacity800. Success dialog appeared after full16777248-byte native header validation with matching CRC e9dc98d9. After acknowledging it, runtime read-back reports12800players/800teams/3359jerseys, A capacity65535/used60543chars and B used63944. Native log records private buffer release at21:19:58UTC. A pre-acknowledgment read still showed stock counts; game load completion must include dialog acknowledgment before claiming decoded state.

The roster UI reaches final team799 (OH TeamM7) and displays its distinct OH P9BT etc. players, withrendered evidence. The source fixture remains synthetic/reused art; this does not certify real full-name rosters, all team transitions, uniforms or gameplay.

The game save attempt on the isolated Capacity800 copy removed the destination and did not write a replacement. Its exact pre-save backup remains in live-bt/Capacity800-pre-save.ROS; originalfixture-h and reference-game were untouched. This is a failed save, not persistence evidence. The original save path allocates a separate temporary buffer after destination handling. Candidate37bu observes that result and supplies private memory only for a null allocation of the exact expanded ROS size, with separately owned save/read pointers and native cleanup forwarding. DLL d00b91e5e10180360cf10836f1e4cc97ad6adaac89fed25a7c55aa09f3cbcaf2 compiled; all152 compiled checks passed, including actual ownership logic with named Win32/trace sinks and save-allocation/free frames at all alignments. Fresh37bv PID8396 started21:32:23UTC with a30-minute owned watchdog; live save/reload is pending. Internal133source archive SHA 612b50d273653b436f4ecc9b3c40a54b623e1619341db76cdf70eb453731f85a is retained.37bt closed by an explicit owned stop; closure receipt.

Native persistence verified; practical-name candidate

37bv with152-check37bu loaded the short-name Capacity800 fixture, saved through the native menu, loaded stock back to105teams/1665players/579jerseys, then reloaded the game-written file. PostACK native counts restored800/12800/3359 and extended A values. The saved file SHA f674ab364de8a14ebd19c9a43d8f5120b31d53a54ecb3cc6033473b38522e77f passedthe independent audit, including all original populated records,695newteams each15distinctassignedplayers/fourjerseys and121086textbytes. Runtime reload receipt andsave popup are separate evidence. Original fixture and pre-save backups remain retained on Dell.

Quick Game selects finalteam799 and reaches live play; starting-lineup presentation shows synthetic names. Aread-only native match frame observes12 distinct added-team active-roster players, five on court. The saved roster has15; do not conflate that with the match's12 observed players or infer a universal row cap. Preparation identity was unavailable in that frame, so its zeroIDs/emptyteamnames are not identity evidence. Reused-art fixture has a visible crowd-texture issue; no full-match/asset certification. 37bv closure records an owned explicit stop.

Current text candidate37bx uses previously unused primary stamps0131..013f for64K-character chunks of arenaA; native012f chunkzero and0130 arenaB remain. Topbyte01 preserves primary-object dispatch. Helpers bound A to1048576UTF16chars/twoMiB and the independent16MiB backing. Both original pointer/handle entry frames have exact guards and native fallbacks. Source134files SHA 707decc9c427a71e944c5ebb497e2115477b4800d62a4379194423efb8289dbb; DLL c93fa3ff7ba4ccd955f8f30435e560ef3e11d9826a29d17477e9c52fb8c4c08d compiled; 196 compiled checks passed, including boundary roundtrips through1048576Achars and nativeB fallbacks. Fresh37bz PID9016 started22:01:32UTC with30-minute owned watchdog; live full-name load/save pending.

Full-length800total-team fixture audit and800added-team fixture audit pass independently. The latter preserves105originalteams and adds800teams with12000distinctassignedplayers and3200uniformrecords:905totalteams/13665players/3779jerseys. Full-length synthetic names use178592Achars, capacity262144chars/512KiB, with names in three64Kcharacter chunks. File SHA cb0789c6a6bd2406eb2fe402feca1f0b10d2994d50b14c1154e2f54c098cea62, Dell roster-capacity37a/fixtures-by/College800.ROS. Names/art remain synthetic; native full-name load/save and REDMC/Sigil compatibility are not yet established.

Full-length905-team load and native save passed

37bz/196-check37bx loaded both CapacityFull (800total/12800players/3359jerseys,A165117usedchars) and College800 (905total/13665players/3779jerseys,A178592usedchars). Runtime name samples include originalMichaelCarter-Williams and appended full names throughEmmanuelMontgomeryAJK. Finalteam904 UI rendersOpenHoopsUniversityP4 and long surnames. An earlier diagnostic assumed file-record header offsets in native records and mislabeled first names; corrected runtime offsets0/4 give properlast/first names. That failed diagnostic is retained separately.

The native save producedsuccess; itsfull independent audit preserves alloriginalpopulatedsections,800addedteams with12000distinctassignedplayers/fourjerseys each,all12000distinctfull-lengthnames and all800extendedteam-namehandles. Saved SHA ec011bc2889a853075ba80b0b1d0603c518a107df0ab34dc598f2c47c8964516; exactcopy retained onDell live-bz/College800-game-saved.ROS, originalfixturecb0789… andpre-savebackup unchanged. Native save buffer released22:13:40UTC.37bz stoppedexplicitly; closure. Fresh37ca PID12048/start22:15:35UTC/deadline22:45:35UTC uses same196-checkDLL and game-writtenfile for separate-process reload. Reference95savehashes/stable35 verified atstaging. Freshprocessstockcounts105/1665/579 and originalnames passed. Fresh-process reload subsequently passed in37ca; see the acceptance section below.

Fresh-process reload, uniform selection and gameplay accepted

Fresh 37ca loaded the native game-written College800 file with matching native CRC 2d84be8b. After acknowledging the success dialog, runtime read-back reports 905 teams / 13,665 players / 3,779 jerseys and intact original/appended full-name samples. A separate fresh stock boot had original counts and names. This is an independent process reload, not merely an in-memory save acknowledgment.

Quick Game reaches final team904, OpenHoops UniversityP4. Its help binds jersey switching to the literal comma/period keys; left/right arrows did not change uniforms. Five observed period pulses produced red, white, white, white, red previews, consistent with four selectable positions using the four retained stock textures uh100, ua100, uh000, ua000. Native selected-index state was not directly read. Red preview and in-match full-name presentation establish that the selected uniform carries into the match.

Live play and a coherent read-only ABI14 frame observe 12 distinct full-name players from the final added team, five on court, at game clock334.28 seconds with Spurs leading2–0. The file audit preserves all15 assigned players; no universal12-player cap is inferred. Preparation identity was unavailable, so zeroIDs/emptyteamnames in that frame are not identity evidence. This was a short startup/play smoke, not a complete-match or custom-asset certification.

The owned closure records an explicit forced research stop, not a crash. Completed task cleanup checks action ownership before removal; the old37j exit cause remains unresolved. The current source archive, original fixture, pre-save copy, native-saved file and configuration backup retain their recorded hashes.

Current research text representation

Serialized record widths, schema signature501551ae and format5 remain original. This representation requires the opt-in OpenHoops roster adapter; REDMC/Sigil and unpatched-game support are not established. Builder outputs always use new isolated paths and retain originals. The read/write helpers remain private executable-specific code, not a public roster-control API.

ArenaA capacity/used character counts are big-endian32-bit words atROS offsets24c/250; B used is at254. The independent parser locates packed record sections from the45-entry table before calculating the text heap. SerializedA characters start fourbytes into that heap; serializedB starts eightbytes plus twiceA capacity into it. Runtime nativeA/B character storage is contiguous without those serialized headers. Strings are null-terminatedUTF16BE in the file and nativeUTF16 in memory.

Handles are32-bit [16-bit stamp][16-bit character offset]. Native012f identifiesA chunkzero and0130 identifiesB. ExtendedA chunk1 uses0131,chunk2 uses0132, throughchunk15=013f. For extendedA, character index is (stamp-0x130)*65536 + low16; chunkzero useslow16 alone. ThusA index65536 is01310000 and index131072 is01320000. Pointer-to-handle conversion performs the inverse. Bounds restrict the currently configured maximum to1048576A characters/twoMiB within the16MiB primary allocation. The512KiB-capacity fixture uses178592characters, so live evidence covers threechunks; the larger maximum has compiled boundary evidence only.

StandaloneROS file admission retains explicit stock/16MiB outer sizes and originalCRC/schema validation. Import CRC hashes the padded destination; file listing uses physical size; null temporary read/save allocations use individually owned private buffers and matching cleanup. These are separate fixes from text addressing. Roster/image conversion tooling isros_image.py; full-name audit isaudit_full_names.py. Both are research tools. Real affected roster/editor versions, customart and exhibition/careercontainer transitions still need scoped integration evidence.