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.

Native metadata and immutable match assets — private work63

Current work70 native70d/DLL5cf76196 passes original70liveo/API70c and college70liveq/API70e acceptance. Both bind metadata at held phase4 before reveal, verify exact copied values/epoch/hash through an independent C reader, actually open the selected court/arena through the guarded immutable overlay and retain identities in reconciled independent final deliveries. Natural results are9–6 and6–3, with zero adapter/host/module faults. API70e's frozen college overtime decoder fix passes634 Windows tests; all88 native inputs are unchanged. Both restore98 baseline files/DLL50/INI; final preservation and custody release pass. Eight platform modes/negative alias control retain their scopes. Protocol1/metadata C ABI1 remain unchanged. Closeout.

This is the API54 candidate, main snapshot ABI26/event ABI4, with a separate platform protocol1 and plain C metadata ABI1. The current scope has headless production integration and captured-instruction checks; exact-DLL live game acceptance is still pending while MVP owns the Dell desktop. It is not a public package or an installation over the stable game.

Copied native metadata

openhoops_metadata.h exports OpenHoopsMetadataReadV1. The caller supplies fixed-size query/value structures and its own text buffer. Query roster, either selected team/uniform, the arena or an instantiated player. An empty key requests entity identity. Context scope returns canonical checked JSON, excluding its own SHA member. A size query returns BUFFER_SMALL and required_bytes, including the trailing NUL. Scalar and entity queries need no text buffer.

Results distinguish unavailable, missing, explicit null, false, zero, number and text. Successful values carry match epoch, run nonce, context SHA, match ID, external entity ID where explicitly bound, source row and field provenance. Supply expected epoch and context SHA across related reads; mismatches return stale. Calls are thread-safe, return copied data and perform no file/network I/O or allocation during lookup. Do not retain pointers or invoke game functions. Invalid caller memory is rejected through the Windows boundary; callers still own valid, independently sized output storage.

The managed request must opt in with launch_configuration.native_metadata=true and supply checked roster metadata or overrides. Initialization holds the opening simulation under the loading cover. The broker durably binds the match, projects that exact frozen context and waits for native hash/epoch/opening-boundary acknowledgement. The hold remains until actual reveal. Invalid data or the90-second opening deadline refuses the owned requested game. Existing metadata launches without this flag continue through HTTP only. Metadata-only plan entries not instantiated by the game remain in canonical JSON and results; they do not acquire invented native player slots.

The independent C rank reader demonstrates the optional standard rank field. This interface supplies data for a future presentation; it does not draw or change rules.

Asset packages

Create a ZIP with one openhoops-assets.json manifest and its declared IFF files:

{"format":"openhoops.asset_package","version":1,"files":[
  {"name":"f011.iff","path":"files/floor.iff","sha256":"LOWERCASE_FILE_SHA256","kind":"court"}
]}

name is the game's existing flat lowercase filename, not an arbitrary logical asset ID. kind is arena, court, uniform, logo or support. Authors remain responsible for compatible models, texture layouts, references and UVs. The container validator checks the supported94ef3bff envelope, segments/resources and bounded compressed data, not every inner model/texture semantic. No assets are supplied or published by this API.

Use Client.upload_asset_package(path), POST /v1/asset-packages with an absolute local ZIP path/SHA, or streamed PUT /v1/asset-packages/{zip_sha256}. Intake freezes checked archive/content identities and returns native_loaded:false. GET verifies a stored descriptor; POST /v1/asset-packages/selection with ids validates a selection and returns its overlay identity. These are admission operations, not evidence that a game loaded an asset.

For a new managed request, declare asset_packages:[{"path":"C:\\MyApp\\art.zip","sha256":"ZIP_SHA256"}], or existing package IDs in that broker state. The broker resolves them before creating the child and writes a frozen launch configuration. Alternatively, launch_configuration.assets accepts existing package IDs. Duplicate equal files can share a selection; conflicting names/hashes/kinds are refused. Package order is part of the selected identity. Later changes to the app's original download do not change the frozen selection.

Limits:1–8 packages;512 files;512MiB per ZIP/file;2GiB expanded/selected bytes. Archive members must be regular, unencrypted, uniquely named and exactly declared, without symlinks, traversal, nested ZIPs or executable payloads. Explicit directory entries are currently refused. Keep3GiB free during admission/staging. Canonical native file paths currently require Windows drive-letter paths.

The selected process redirects only declared root-game IFF reads through the guarded original file import. Installed files remain untouched. Hash-checked read seals and independently reopened handles keep reads attached to the frozen file even if an ancestor path is renamed. Selected write/execute/create/delete attempts are refused; a refusal or read failure stops the requested game. Unselected and outside-root paths retain native behavior. No selected files means the import remains native.

GET /v1/platform and snapshot.extension_platform show committed metadata and per-file read counters. A read proves routing/opening, not pixel correctness or all asset references. Results retain package/file hashes, overlay identity and counters frozen at the first reconciled final observation, so later presentation reads cannot delay or revise basketball results. A lost asset contract produces review-required state, not an ordinary successful result. Asset hot-swap, checkpoint resume, arbitrary formats/subfolders and custom presentation remain unavailable.

Evidence

  • platform63a:2,954 parser/negative/truncation checks plus12 independent C checks; C/Python structure sizes agree.
  • platform63j: production C export, commit/reveal hold, independent sealed reads, outside-root/native passthrough; bad hash/epoch/phase/deadline and write-refusal processes.
  • assets63b: two real stock court/arena containers pass bounded admission, separate from native game/render acceptance.
  • Exact current source/DLL and broader rules checks are tracked in the active ledger. Earlier failures remain preserved.