{
  "contract_context": {
    "entrypoint_context": "Source: [`sco_api.h`](../include/sco_api.h),\n[`loader.cpp`](../src/plugins/loader.cpp), [plugin exports](api-v1.md#the-plugins-exports).\nAll three are required for a native DLL. The loader contains faults in these exports;\nthis is containment, not memory safety or a sandbox. Query is called before load;\nload is called after version checks. Shutdown delivery is best effort, not a\ncrash-safe persistence mechanism. Ordinary owner release runs resource hooks;\nrestart-required retained-provider faults skip them. An exposed provider whose load\nreturns non-OK may instead be refused with backing state retained; this is distinct\nfrom a fault and does not run owner release or clear exports/module state.",
    "reading_rules": "- Result names without the prefix mean the corresponding `SCO_*` value. Normal\n  success is `SCO_OK` unless the row describes a Boolean, ID, count, string or void\n  result. Listed failures are known cases, **not an exhaustive proof of every fault**;\n  unspecified cases and precedence between simultaneous errors remain unspecified.\n- The **size / since** cell gives the minimum x64 table byte extent that includes\n  the *whole* function pointer, not just its first byte. Check `size >=\n  offsetof(Table, method) + sizeof(table->method)` **before reading that pointer**,\n  then check it is non-NULL. A version match alone does not justify reading an\n  uncovered tail. The historical examples using `size > offsetof(...)` presume a\n  well-formed complete provider table; current consumers must use the full extent\n  and non-null method check, not that historical shorthand.\n- For service discovery, `query_service` requires equal version majors and a\n  provider minor at least the requested minor. Missing service: `SCO_NOT_FOUND`;\n  incompatible/older version: `SCO_UNAVAILABLE`; output table NULL except on success.\n  No missing pointer or service should be called. Tables may grow only by appending\n  fields; unknown tails are not to be inspected. Host/game-owned tables outlive all\n  plugins and are withdrawn after plugin unload. Third-party tables have the\n  provider's lifetime, not that of the querying plugin.\n- Caller size-prefixed inputs/outputs use `sizeof` as built by the caller. An\n  oversized buffer/struct is not a promise that an unknown tail is initialized:\n  **tail initialization and preservation are unspecified unless noted**. Command\n  argument-definition stride is `arg_def_size`; `sco_arg` is frozen at 16 bytes,\n  `sco_sql_value` at 16 bytes and `sc_vehicle_seat` at 96 bytes. Padding/reserved\n  input fields are zero. Enums are 4 bytes; do not pass `_FORCE32` sentinels.\n- **Byte handshake**: `*inout_size` is capacity on entry, bytes written on success,\n  bytes needed with `SCO_TOO_MANY`; NULL output with zero capacity asks the size.\n  Text is NUL-terminated and the terminator counts. This is not the same as\n  `get_peers`' element-count handshake or the truncating fixed-capacity name calls.\n  Required size may change between calls: retry if needed, not an atomic snapshot.\n- Caller buffers stay caller-owned. No returned service pointer, string, mapping,\n  command descriptor, frame or game ID is an allocation the plugin may free.\n  “No allocation transfer” does **not** mean “no internal allocation” or “real-time\n  safe.” Internal allocation bounds/latency are unspecified unless recorded.\n- Unless a row says inputs are copied, their retention is **unspecified** beyond\n  the synchronous call. Keep borrowed callback code and ctx alive for its registration\n  or queued lifetime; ctx is not automatically freed. Callback payload pointers are\n  valid during the callback only; copy retained data.\n- Any-thread permission is not a recursive-reentrancy guarantee. Rows explicitly\n  mark known callback-safe operations and otherwise say reentrancy unspecified.\n  Game-thread permission does not permit calls from a game hook or arbitrary worker.\n- “No cancellation entrypoint” records API surface, not guaranteed completion,\n  rollback or an interruptible call. Unload/crash cleanup and callback quiescence\n  are stated separately. Synchronous calls have no cancel token. Cancellation of\n  an operation already in progress is unspecified unless stated.\n- `last_error` is a diagnostic, not a return-value replacement: scope varies by\n  service and another call may overwrite it. Complete diagnostics for every failure\n  and error-text retention after success are unspecified unless documented.",
    "remaining_gaps": "This is an inventory-complete catalogue, not a claim that the API has a complete\nbehavioral specification. In particular:\n\n- Recursive reentrancy/depth, lock-acquisition latency, internal allocation bounds\n  and worker-vs-unload quiescence are unspecified for most methods. Any-thread\n  support alone does not establish them.\n- There is no general cancel-token API or promise to interrupt running calls.\n  Queue drop, registration withdrawal, rollback, deferred despawn and a game\n  action's actual completion are different events; do not conflate them.\n- No universal failure-output, tail-zeroing or diagnostic-isolation rule exists.\n  Some methods zero outputs, some leave them unchanged, some change required\n  sizes and some can fail after producing a game side effect. Buffer-specific\n  conditions above take precedence over broad header prose.\n- DataCore's allocation-exception translation, concurrent commits/discards on the\n  same patch and ordering of competing saved-file commits are unspecified.\n- spawn.entities failure-reason lifetime is unspecified; copy it during the call's\n  immediate use and do not free it. Tracking failure may follow a successful spawn.\n- game.vehicles / game.creative do not establish uniform released-self rejection\n  or error-isolation guarantees; their last_error implementations need not enforce\n  handle/service-start checks. Other game diagnostics also have no stopped-service\n  refusal guarantee. Do not use stale handles merely because a table is still mapped.\n- Direct IPC view synchronization with peers/close/unload is unspecified by this\n  service table; a borrowed mapping does not grant safe concurrent unmapping.\n- Watch/query-radius/state reserved behavior remains gated off; event vehicle-seat\n  payload, actor health maximum and camera field of view are not filled from a\n  verified live-game contract. Event payloads are not additional method rows;\n  [game services](game-services.md#events) documents delivery and absent capability.\n\nFor additions, append a record under `sdk/contracts/` and update the corresponding\nmethod row and inventory here. Run `tools/sdk_catalogue.py check` to compare both\nwith compiled header declarations and member extents. A comment, signature or\nsibling service's behavior is not evidence for an unstated guarantee on a new method.",
    "source": "docs/contracts.md"
  },
  "game_pack_version": "0.6.0",
  "records": [
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*despawn)(sco_plugin* self, uint64_t entity_id);`<br>Removes an NPC you spawned with spawn_npc. SCO_OK starts the removal: the NPC leaves the world within a few seconds (one that hasn't streamed in yet goes once it has), and the id is no longer yours. SCO_NOT_FOUND: not an NPC you spawned here, or despawned already.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-despawn",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*despawn)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "sco_result Despawn(uint64_t id) const noexcept { return t_ && Covers(t_->size, offsetof(sc_actors_v1, despawn)) && t_->despawn ? t_->despawn(self_, id) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "public ScoResult Despawn(ulong id) => !Covers(24) || _t->despawn == null ? ScoResult.Unavailable : _t->despawn(Self, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Lua gets the game services **read-only**: queries, never a function that changes the game, so a script owns no NPCs."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "Removes an NPC you spawned with spawn_npc. SCO_OK starts the removal: the NPC leaves the world within a few seconds (one that hasn't streamed in yet goes once it has), and the id is no longer yours. SCO_NOT_FOUND: not an NPC you spawned here, or despawned already.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; invalid/released self: BAD_ARG. See method detail for game failures. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.actors",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.despawn",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*health)(uint64_t id, float* out_cur, float* out_max);`<br>1.1. The health pool of the actor whose entity id is id: your player's (local_player's entity id) or an NPC's (spawn_npc's id), once it has streamed in. *out_cur = the game's HealthPool stat in its own units. *out_max = 0: the maximum isn't read yet, 0 means unknown (the field is here so a later game pack can fill it without a new table). Either pointer may be NULL to skip it, not both. Read-only: no self; a failure's reason is last_error(NULL, ...). SCO_NOT_FOUND: id isn't streamed in or isn't an actor. SCO_UNAVAILABLE: game.actors.health isn't ready. SCO_BAD_ARG: both pointers NULL. SCO_FAILED: the game faulted. Implementation: outputs zeroed before failure checks; id 0 BAD_ARG. Maximum 0 is unknown.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-health",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*health)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "return t_->health(id, &cur, &max);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "ScoResult r = !Covers(40) || _t->health == null ? ScoResult.Unavailable : _t->health(id, &c, &m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(a, sc_actors_v1, health) ? a->health(id, &cur, &max) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "1.1. The health pool of the actor whose entity id is id: your player's (local_player's entity id) or an NPC's (spawn_npc's id), once it has streamed in. *out_cur = the game's HealthPool stat in its own units. *out_max = 0: the maximum isn't read yet, 0 means unknown (the field is here so a later game pack can fill it without a new table). Either pointer may be NULL to skip it, not both. Read-only: no self; a failure's reason is last_error(NULL, ...). SCO_NOT_FOUND: id isn't streamed in or isn't an actor. SCO_UNAVAILABLE: game.actors.health isn't ready. SCO_BAD_ARG: both pointers NULL. SCO_FAILED: the game faulted. Implementation: outputs zeroed before failure checks; id 0 BAD_ARG. Maximum 0 is unknown.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; invalid/released self: BAD_ARG. See method detail for game failures. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.actors",
      "signature": "sco_result (*)(uint64_t, float *, float *)",
      "since": "`size >= 48`; 1.1",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.health",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for self's last failed call (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). self NULL: the last failure of a call made without a plugin handle (local_player). Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "sco_result r = t_->last_error(who, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "return Storage.Sized((buf, size) => ((ScActorsV1*)t)->last_error((void*)who, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (GAME_MEMBER(a, sc_actors_v1, last_error) && a->last_error(NULL, msg, &size) == SCO_OK && msg[0]) { lua_pushstring(L, msg); return 3; }"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "stopped-service refusal unspecified (no started check).",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "The reason for self's last failed call (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). self NULL: the last failure of a call made without a plugin handle (local_player). Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released non-NULL self or buffer; TOO_MANY required bytes. NULL self selects no-self failures; stopped-service refusal unspecified (no started check).",
      "service": "game.actors",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.last_error",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*local_player)(uint64_t* out_actor_id, uint64_t* out_entity_id);`<br>Your player: *out_actor_id, the id the game's client player record names your actor by (the id the game resolves to your actor), and *out_entity_id, your entity's id (the same as spawn.entities' local_player_id; use it with teleport.spatial and spawn.entities). Both 0 on failure. Either pointer may be NULL to skip it, not both. SCO_NOT_FOUND: you haven't spawned yet. Read-only: no self; a failure's reason is last_error(NULL, ...).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-local-player",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*local_player)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_actors_v1, local_player)) && t_->local_player ? t_->local_player(&actorId, &entityId) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "ScoResult r = !Covers(8) || _t->local_player == null ? ScoResult.Unavailable : _t->local_player(&a, &e);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(a, sc_actors_v1, local_player) ? a->local_player(&actor, &entity) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "Your player: *out_actor_id, the id the game's client player record names your actor by (the id the game resolves to your actor), and *out_entity_id, your entity's id (the same as spawn.entities' local_player_id; use it with teleport.spatial and spawn.entities). Both 0 on failure. Either pointer may be NULL to skip it, not both. SCO_NOT_FOUND: you haven't spawned yet. Read-only: no self; a failure's reason is last_error(NULL, ...).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; invalid/released self: BAD_ARG. See method detail for game failures. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.actors",
      "signature": "sco_result (*)(uint64_t *, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.local_player",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*spawn_npc)(sco_plugin* self, const char* archetype_class, uint64_t zone_id, const double pos[3], uint64_t* out_id);`<br>Spawns an NPC of archetype_class (an entity class name, as in sc-offline's npcs.txt) at pos in zone zone_id's local frame, facing the zone's axes. *out_id = the new entity id, 0 on failure. The id is final at once; the NPC streams in a few seconds later. The NPC is yours (see Ownership above). SCO_BAD_ARG: a null or released self, a null class, pos or out_id, zone 0, or a position that isn't finite. SCO_NOT_FOUND: the zone isn't streamed in, or the class doesn't exist on this game build. SCO_TOO_MANY: SC_ACTORS_MAX_NPCS are alive. SCO_FAILED: the game refused or faulted.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-spawn-npc",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*spawn_npc)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_actors_v1, spawn_npc)) && t_->spawn_npc ? t_->spawn_npc(self_, archetypeClass, zoneId, pos, &id) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "r = _t->spawn_npc(Self, c, zoneId, p, &n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Lua gets the game services **read-only**: queries, never a function that changes the game, so a script owns no NPCs."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "Spawns an NPC of archetype_class (an entity class name, as in sc-offline's npcs.txt) at pos in zone zone_id's local frame, facing the zone's axes. *out_id = the new entity id, 0 on failure. The id is final at once; the NPC streams in a few seconds later. The NPC is yours (see Ownership above). SCO_BAD_ARG: a null or released self, a null class, pos or out_id, zone 0, or a position that isn't finite. SCO_NOT_FOUND: the zone isn't streamed in, or the class doesn't exist on this game build. SCO_TOO_MANY: SC_ACTORS_MAX_NPCS are alive. SCO_FAILED: the game refused or faulted.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; invalid/released self: BAD_ARG. See method detail for game failures. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.actors",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint64_t, const double *, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.spawn_npc",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*state)(uint64_t id, uint32_t* out_state);`<br>1.1. *out_state = an sc_actor_state. Not published yet: SCO_UNAVAILABLE until game.actors.state is ready. Implementation: output initialized to 0; NULL out BAD_ARG, wrong thread WRONG_THREAD; valid call still UNAVAILABLE, not an ALIVE answer.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned NPCs removed on ordinary unload/non-retained crash cleanup; despawn starts deferred removal. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-actors-v1-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_actors.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/actors.hpp",
              "token": "const sco_result r = t_->state(id, &raw);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_actors.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Actors.cs",
              "token": "ScoResult r = !Covers(48) || _t->state == null ? ScoResult.Unavailable : _t->state(id, &s);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "`state` isn't in Lua: it isn't available yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns NPC tracking; entity IDs are session values. Internal allocation unspecified.",
      "purpose": "1.1. *out_state = an sc_actor_state. Not published yet: SCO_UNAVAILABLE until game.actors.state is ready. Implementation: output initialized to 0; NULL out BAD_ARG, wrong thread WRONG_THREAD; valid call still UNAVAILABLE, not an ALIVE answer.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; invalid/released self: BAD_ARG. See method detail for game failures. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.actors",
      "signature": "sco_result (*)(uint64_t, uint32_t *)",
      "since": "`size >= 56`; 1.1",
      "source_header": "include/sc_actors.h",
      "symbol": "sc_actors_v1.state",
      "table": "sc_actors_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_actors.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.asop.claim_timeout OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*claim_timeout)(sco_plugin* self, int32_t* out_seconds);`<br>*out_seconds = the request timeout, in seconds, of the game's insurance component configuration: how long a ship terminal claim request waits for an answer. SCO_BAD_ARG: out_seconds NULL. SCO_NOT_FOUND: the insurance configuration isn't loaded yet. SCO_FAILED: the game faulted. game.asop.claim_timeout.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; both functions are reads and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-asop-v1-claim-timeout",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_asop.h",
              "token": "(*claim_timeout)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_asop.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "*out_seconds = the request timeout, in seconds, of the game's insurance component configuration: how long a ship terminal claim request waits for an answer. SCO_BAD_ARG: out_seconds NULL. SCO_NOT_FOUND: the insurance configuration isn't loaded yet. SCO_FAILED: the game faulted. game.asop.claim_timeout.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.asop.claim_timeout OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.asop",
      "signature": "sco_result (*)(sco_plugin *, int32_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_asop.h",
      "symbol": "sc_asop_v1.claim_timeout",
      "table": "sc_asop_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_game_asop.c",
        "tests/test_asop.cpp"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ASOP_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; both functions are reads and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-asop-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_asop.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_asop.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. On the game thread with a loaded self: your own last error; otherwise the thread's last refusal.",
      "service": "game.asop",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_asop.h",
      "symbol": "sc_asop_v1.last_error",
      "table": "sc_asop_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_game_asop.c",
        "tests/test_asop.cpp"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_ASOP_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.asop.shard_persisted OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*shard_persisted)(sco_plugin* self, uint32_t* out_persisted);`<br>*out_persisted = 1 when the game's IsShardPersisted flag is set, 0 when it is clear: the flag the ship terminal's open checks before it opens. SCO_BAD_ARG: out_persisted NULL. SCO_FAILED: the game faulted. game.asop.shard_persisted.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; both functions are reads and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-asop-v1-shard-persisted",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_asop.h",
              "token": "(*shard_persisted)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_asop.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.asop routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "*out_persisted = 1 when the game's IsShardPersisted flag is set, 0 when it is clear: the flag the ship terminal's open checks before it opens. SCO_BAD_ARG: out_persisted NULL. SCO_FAILED: the game faulted. game.asop.shard_persisted.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.asop.shard_persisted OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.asop",
      "signature": "sco_result (*)(sco_plugin *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_asop.h",
      "symbol": "sc_asop_v1.shard_persisted",
      "table": "sc_asop_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_game_asop.c",
        "tests/test_asop.cpp"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_ASOP_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; the function is a read and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-contracts-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_contracts.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_contracts.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. On the game thread with a loaded self: your own last error; otherwise the thread's last refusal.",
      "service": "game.contracts",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_contracts.h",
      "symbol": "sc_contracts_v1.last_error",
      "table": "sc_contracts_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_contracts.c",
        "tests/test_contracts.cpp"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_CONTRACTS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.contracts.stream_radius OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*stream_radius)(sco_plugin* self, float* out_radius);`<br>*out_radius = the mission stream radius the game's mission settings hold (a 32-bit float, in the game's own units). SCO_BAD_ARG: out_radius NULL. SCO_NOT_FOUND: the mission settings aren't loaded yet. SCO_FAILED: the game faulted. game.contracts.stream_radius.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; the function is a read and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-contracts-v1-stream-radius",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_contracts.h",
              "token": "(*stream_radius)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_contracts.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C++, C# and Lua game.contracts routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "*out_radius = the mission stream radius the game's mission settings hold (a 32-bit float, in the game's own units). SCO_BAD_ARG: out_radius NULL. SCO_NOT_FOUND: the mission settings aren't loaded yet. SCO_FAILED: the game faulted. game.contracts.stream_radius.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.contracts.stream_radius OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.contracts",
      "signature": "sco_result (*)(sco_plugin *, float *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_contracts.h",
      "symbol": "sc_contracts_v1.stream_radius",
      "table": "sc_contracts_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_contracts.c",
        "tests/test_contracts.cpp"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CONTRACTS_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "return ref_->last_error(self_, out.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "return Storage.Sized((buf, size) => _t->last_error(Self, buf, size), out byte[] b) == ScoResult.Ok ? Utf8.FromBytes(b) : \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (GAME_MEMBER(c, sc_creative_v1, last_error) && c->last_error(self, msg, &size) == SCO_OK && msg[0]) { lua_pushstring(L, msg); return 3; }"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "self validity and stopped-service rejection unspecified.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 64,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. Implementation selects newer own/shared-query error on game thread; otherwise thread refusal. self validity and stopped-service rejection unspecified.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.last_error",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_fly_mode)(sco_plugin* self, int on);`<br>Fly mode (noclip) on or off, for your player. SCO_FAILED: you're not spawned yet, your actor has no fly handler, the game faulted, or no release hook is left. Switching it off when it isn't on is SCO_OK and does nothing. game.creative.fly.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-set-fly-mode",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*set_fly_mode)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "sco_result SetFlyMode(bool on) const noexcept { return detail::CanCall(ref_.Get(), &sc_creative_v1::set_fly_mode) ? ref_->set_fly_mode(self_, on ? 1 : 0) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "public ScoResult SetFlyMode(bool on) => _t == null || _t->size < (uint)((byte*)&_t->set_fly_mode - (byte*)_t + sizeof(nint)) || _t->set_fly_mode == null ? ScoResult.Unavailable : _t->set_fly_mode(Self, on ? 1 : 0);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can see which toggles are on but can't switch any"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "Fly mode (noclip) on or off, for your player. SCO_FAILED: you're not spawned yet, your actor has no fly handler, the game faulted, or no release hook is left. Switching it off when it isn't on is SCO_OK and does nothing. game.creative.fly.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, int)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.set_fly_mode",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_fly_speed)(sco_plugin* self, float mps);`<br>The fly speed in metres per second: finite, above 0 and at most SC_CREATIVE_FLY_SPEED_MAX (SCO_BAD_ARG otherwise). The game's own speed comes back when your plugin unloads. SCO_UNAVAILABLE: no fly capability, or the game's fly speed field wasn't found on this build. SCO_FAILED: the game's settings aren't up yet. game.creative.fly.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-set-fly-speed",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*set_fly_speed)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "sco_result SetFlySpeed(float mps) const noexcept { return detail::CanCall(ref_.Get(), &sc_creative_v1::set_fly_speed) ? ref_->set_fly_speed(self_, mps) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "public ScoResult SetFlySpeed(float mps) => _t == null || _t->size < (uint)((byte*)&_t->set_fly_speed - (byte*)_t + sizeof(nint)) || _t->set_fly_speed == null ? ScoResult.Unavailable : _t->set_fly_speed(Self, mps);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can see which toggles are on but can't switch any"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "The fly speed in metres per second: finite, above 0 and at most SC_CREATIVE_FLY_SPEED_MAX (SCO_BAD_ARG otherwise). The game's own speed comes back when your plugin unloads. SCO_UNAVAILABLE: no fly capability, or the game's fly speed field wasn't found on this build. SCO_FAILED: the game's settings aren't up yet. game.creative.fly.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, float)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.set_fly_speed",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_god_mode)(sco_plugin* self, int on);`<br>God mode on (non-zero) or off (0). SCO_OK also when you haven't spawned yet: it is applied once you have. SCO_FAILED: the game faulted, or the host can't turn the toggle off when your plugin unloads (no release hook left). game.creative.god_mode.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-set-god-mode",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*set_god_mode)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "sco_result SetGodMode(bool on) const noexcept { return detail::CanCall(ref_.Get(), &sc_creative_v1::set_god_mode) ? ref_->set_god_mode(self_, on ? 1 : 0) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "public ScoResult SetGodMode(bool on) => _t == null || _t->size < (uint)((byte*)&_t->set_god_mode - (byte*)_t + sizeof(nint)) || _t->set_god_mode == null ? ScoResult.Unavailable : _t->set_god_mode(Self, on ? 1 : 0);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can see which toggles are on but can't switch any"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "God mode on (non-zero) or off (0). SCO_OK also when you haven't spawned yet: it is applied once you have. SCO_FAILED: the game faulted, or the host can't turn the toggle off when your plugin unloads (no release hook left). game.creative.god_mode.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, int)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.set_god_mode",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_infinite_ammo)(sco_plugin* self, int on);`<br>Infinite ammo for the weapons you carry: a magazine you fire from is topped up to its maximum. SCO_FAILED when the magazine setter can't be hooked or no release hook is left. game.creative.ammo.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-set-infinite-ammo",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*set_infinite_ammo)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "sco_result SetInfiniteAmmo(bool on) const noexcept { return detail::CanCall(ref_.Get(), &sc_creative_v1::set_infinite_ammo) ? ref_->set_infinite_ammo(self_, on ? 1 : 0) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "public ScoResult SetInfiniteAmmo(bool on) => _t == null || _t->size < (uint)((byte*)&_t->set_infinite_ammo - (byte*)_t + sizeof(nint)) || _t->set_infinite_ammo == null ? ScoResult.Unavailable : _t->set_infinite_ammo(Self, on ? 1 : 0);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can see which toggles are on but can't switch any"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "Infinite ammo for the weapons you carry: a magazine you fire from is topped up to its maximum. SCO_FAILED when the magazine setter can't be hooked or no release hook is left. game.creative.ammo.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, int)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.set_infinite_ammo",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_infinite_ship_ammo)(sco_plugin* self, int on);`<br>The same for every weapon on the ship you're aboard (including ones that drain their magazine without the setter: topped up twice a second). game.creative.ship_ammo.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-set-infinite-ship-ammo",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*set_infinite_ship_ammo)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "return detail::CanCall(ref_.Get(), &sc_creative_v1::set_infinite_ship_ammo) ? ref_->set_infinite_ship_ammo(self_, on ? 1 : 0) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "public ScoResult SetInfiniteShipAmmo(bool on) => _t == null || _t->size < (uint)((byte*)&_t->set_infinite_ship_ammo - (byte*)_t + sizeof(nint)) || _t->set_infinite_ship_ammo == null ? ScoResult.Unavailable : _t->set_infinite_ship_ammo(Self, on ? 1 : 0);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can see which toggles are on but can't switch any"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "The same for every weapon on the ship you're aboard (including ones that drain their magazine without the setter: topped up twice a second). game.creative.ship_ammo.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, int)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.set_infinite_ship_ammo",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*state)(sco_plugin* self, uint32_t* out_flags);`<br>out_flags = the sc_creative_flag bits that are on. SCO_UNAVAILABLE only when none of the four capabilities is ready.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned toggles switched off and speed restored on ordinary unload/non-retained crash cleanup. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-creative-v1-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_creative.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_creative.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/creative.hpp",
              "token": "return detail::CanCall(ref_.Get(), &sc_creative_v1::state) ? ref_->state(self_, &flags) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_creative.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Creative.cs",
              "token": "ScoResult r = _t == null || _t->size < (uint)((byte*)&_t->state - (byte*)_t + sizeof(nint)) || _t->state == null ? ScoResult.Unavailable : _t->state(Self, &f);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "lua_pushstring(L, dc->state() == SCO_DC_OPEN ? \"open\" : \"loaded\");"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "Caller outputs; host owns toggle state. No allocation transfer; internal allocation unspecified.",
      "purpose": "out_flags = the sc_creative_flag bits that are on. SCO_UNAVAILABLE only when none of the four capabilities is ready.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing feature capability: UNAVAILABLE; null/unknown self: BAD_ARG; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.creative",
      "signature": "sco_result (*)(sco_plugin *, uint32_t *)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_creative.h",
      "symbol": "sc_creative_v1.state",
      "table": "sc_creative_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_creative.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    {
      "absent_capability": "Table absent: query_service NOT_FOUND; feature unavailable: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*get_bool)(sco_plugin* self, const char* name, uint32_t type, uint32_t* out);`<br>Read one exact allowlisted SQ42 bool; copied 0 or 1, output unchanged on failure.",
      "callback_context": "Host-only verified offline engine port; no plugin callbacks.",
      "cleanup": "No mutation in this table. Stop withdraws discovery and refuses cached calls; fault retains adapter context and prevents restart.",
      "examples": [],
      "id": "sc-cvars-v1-get-bool",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_cvars.h",
              "token": "(*get_bool)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_cvars.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/cvars.hpp",
              "token": "table_->get_bool(self_, name, SC_CVAR_BOOL, &out)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_cvars_extent.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "C# and Lua routes are"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "explicitly unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production engine ABI/type bridge unverified; capability OFF without a reviewed port.",
        "Windows/MSVC/SEH and in-game acceptance not verified."
      ],
      "member_extent": 16,
      "ownership": "Live caller handle; copied output; host session-lifetime borrowed table; no allocation transfer.",
      "purpose": "Read one exact allowlisted SQ42 bool; copied 0 or 1, output unchanged on failure.",
      "reentrancy": "Refused with FAILED.",
      "results": "BAD_ARG invalid name/type/output/self or released handle; UNAVAILABLE absent capability/admission/adapter/session; FAILED noncanonical backend bool; CRASHED adapter fault latches restart-required.",
      "service": "game.cvars",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint32_t, uint32_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_cvars.h",
      "symbol": "sc_cvars_v1.get_bool",
      "table": "sc_cvars_v1",
      "table_size": 16,
      "tests": [
        "tests/abi_game_cvars.c",
        "tests/test_cvars.cpp",
        "tests/test_cvars_extent.cpp",
        "tests/fixtures/cvars_probe.c"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere; non-reentrant (FAILED).",
      "version_macro": "SC_CVARS_VERSION"
    },
    {
      "absent_capability": "Table absent: query_service NOT_FOUND; operation unavailable: UNAVAILABLE. Explicit restore may ignore feature capability loss for cleanup.",
      "buffer_contract": "`sco_result (*restore_all)(sco_plugin* self);`<br>Restore this live owner's first prior values; release only successfully verified leases, no-op OK if none.",
      "callback_context": "Host-only verified offline engine callbacks; no plugin callbacks.",
      "cleanup": "Explicit owner restore, ordinary release via existing spawn dispatcher, game.exit and stop restore first priors; failed restoration retains outstanding leases/context, no retry or replacement until process restart. Loader-retained provider faults skip owner hooks; host session/stop cleanup is independent.",
      "examples": [],
      "id": "sc-cvars-write-v1-restore-all",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_cvars_write.h",
              "token": "(*restore_all)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_cvars_write.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/cvars_write.hpp",
              "token": "table_->restore_all(self_)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_cvars_extent.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "C# and Lua remain unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "C# and Lua remain unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production engine lookup/get/set signatures/types and native fault boundary unverified; capability OFF.",
        "Portable dispatcher stand-in; Windows spawn dispatcher, SEH, MSVC and gameplay not verified.",
        "No arbitrary console, bridge values or persistent config changes."
      ],
      "member_extent": 24,
      "ownership": "Per-name exclusive live-owner lease; first prior bool retained before mutation; copied scalar inputs; no allocation transfer.",
      "purpose": "Restore this live owner's first prior values; release only successfully verified leases, no-op OK if none.",
      "reentrancy": "FAILED; cleanup during active adapter call retains lease and requires restart.",
      "results": "BAD_ARG unknown or released handle; UNAVAILABLE stopped/session-ended/terminal/fault admission; FAILED recursive call. Restore bypasses feature capability loss; engine failure or readback mismatch latches restart-required and retains unrestored leases.",
      "service": "game.cvars_write",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_cvars_write.h",
      "symbol": "sc_cvars_write_v1.restore_all",
      "table": "sc_cvars_write_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_cvars_write.c",
        "tests/test_cvars_write.cpp",
        "tests/test_cvars_extent.cpp",
        "tests/fixtures/cvars_probe.c"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere; recursive calls refused.",
      "version_macro": "SC_CVARS_WRITE_VERSION"
    },
    {
      "absent_capability": "Table absent: query_service NOT_FOUND; operation unavailable: UNAVAILABLE. Explicit restore may ignore feature capability loss for cleanup.",
      "buffer_contract": "`sco_result (*set_bool)(sco_plugin* self, const char* name, uint32_t type, uint32_t value);`<br>Write a canonical bool to one exact allowlisted name; capture first prior value and verify readback.",
      "callback_context": "Host-only verified offline engine callbacks; no plugin callbacks.",
      "cleanup": "Explicit owner restore, ordinary release via existing spawn dispatcher, game.exit and stop restore first priors; failed restoration retains outstanding leases/context, no retry or replacement until process restart. Loader-retained provider faults skip owner hooks; host session/stop cleanup is independent.",
      "examples": [],
      "id": "sc-cvars-write-v1-set-bool",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_cvars_write.h",
              "token": "(*set_bool)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_cvars_write.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/cvars_write.hpp",
              "token": "table_->set_bool(self_, name, SC_CVAR_BOOL, value ? 1u : 0u)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_cvars_extent.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "C# and Lua remain unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/game/cvars.md",
              "token": "C# and Lua remain unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production engine lookup/get/set signatures/types and native fault boundary unverified; capability OFF.",
        "Portable dispatcher stand-in; Windows spawn dispatcher, SEH, MSVC and gameplay not verified.",
        "No arbitrary console, bridge values or persistent config changes."
      ],
      "member_extent": 16,
      "ownership": "Per-name exclusive live-owner lease; first prior bool retained before mutation; copied scalar inputs; no allocation transfer.",
      "purpose": "Write a canonical bool to one exact allowlisted name; capture first prior value and verify readback.",
      "reentrancy": "FAILED; cleanup during active adapter call retains lease and requires restart.",
      "results": "BAD_ARG invalid name/type/noncanonical bool/unknown or released handle; UNAVAILABLE admission/capability/adapter/cleanup missing or name held by another owner; engine failure or readback mismatch latches restart-required and retains unrestored leases.",
      "service": "game.cvars_write",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint32_t, uint32_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_cvars_write.h",
      "symbol": "sc_cvars_write_v1.set_bool",
      "table": "sc_cvars_write_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_cvars_write.c",
        "tests/test_cvars_write.cpp",
        "tests/test_cvars_extent.cpp",
        "tests/fixtures/cvars_probe.c"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere; recursive calls refused.",
      "version_macro": "SC_CVARS_WRITE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*apply)(sco_plugin* self, const sc_economy_request* request, sc_economy_receipt* out);`<br>Apply one bounded signed local-wallet delta with expected-balance compare and nonzero owner/session idempotency key. Identical replay returns the first receipt; changed replay is BAD_ARG. No receipt eviction or automatic save/payout.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-economy-v1-apply",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*apply)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*apply)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 24,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Apply one bounded signed local-wallet delta with expected-balance compare and nonzero owner/session idempotency key. Identical replay returns the first receipt; changed replay is BAD_ARG. No receipt eviction or automatic save/payout.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.economy",
      "signature": "sco_result (*)(sco_plugin *, const sc_economy_request *, sc_economy_receipt *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_economy.h",
      "symbol": "sc_economy_v1.apply",
      "table": "sc_economy_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_ECONOMY_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*balance)(sco_plugin* self, sc_economy_balance* out);`<br>Read the admitted offline local wallet as an integer in [0,1000000000000). No accounts or online balances; caller-sized output record is preserved.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-economy-v1-balance",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*balance)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*balance)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 16,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Read the admitted offline local wallet as an integer in [0,1000000000000). No accounts or online balances; caller-sized output record is preserved.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.economy",
      "signature": "sco_result (*)(sco_plugin *, sc_economy_balance *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_economy.h",
      "symbol": "sc_economy_v1.balance",
      "table": "sc_economy_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_ECONOMY_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*receipt)(sco_plugin* self, uint64_t key, sc_economy_receipt* out);`<br>Read an owned session-local payment receipt by key. NOT_FOUND when absent, stale session or another owner. No persistent once-only guarantee across session restart.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-economy-v1-receipt",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*receipt)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_economy.h",
              "token": "(*receipt)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 32,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Read an owned session-local payment receipt by key. NOT_FOUND when absent, stale session or another owner. No persistent once-only guarantee across session restart.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.economy",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, sc_economy_receipt *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_economy.h",
      "symbol": "sc_economy_v1.receipt",
      "table": "sc_economy_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_ECONOMY_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*alive)(uint64_t entity_id);`<br>1 when the entity is streamed in, else 0 (also when the capability isn't ready or off the game thread).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-alive",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*alive)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "bool Alive(uint64_t id) const noexcept { return t_ && Covers(t_->size, offsetof(sc_entities_v1, alive)) && t_->alive && t_->alive(id) != 0; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "public bool Alive(ulong id) => Covers(8) && _t->alive != null && _t->alive(id) != 0;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const int alive = GAME_MEMBER(e, sc_entities_v1, alive) ? e->alive(id) : 0;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "1 when the entity is streamed in, else 0 (also when the capability isn't ready or off the game thread).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "int (*)(uint64_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.alive",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*class_of)(uint64_t entity_id, char* out, uint32_t* inout_size);`<br>The entity's class name (the name spawn takes), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). SCO_NOT_FOUND: the entity isn't streamed in. SCO_UNAVAILABLE: no \"game.entities.class_of\". SCO_FAILED: the game faulted or the name isn't a plausible class name. Read-only: no self; a failure's reason is last_error(NULL, ...). Implementation clears out[0] when capacity &gt; 0 and initializes inout_size to 0 before failure checks.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-class-of",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*class_of)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "sco_result r = t_->class_of(id, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "ScoResult r = Storage.Sized((buf, size) => ((ScEntitiesV1*)t)->class_of(id, buf, size), out byte[] b);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(e, sc_entities_v1, class_of) ? e->class_of(id, name, &size) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "The entity's class name (the name spawn takes), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). SCO_NOT_FOUND: the entity isn't streamed in. SCO_UNAVAILABLE: no \"game.entities.class_of\". SCO_FAILED: the game faulted or the name isn't a plausible class name. Read-only: no self; a failure's reason is last_error(NULL, ...). Implementation clears out[0] when capacity &gt; 0 and initializes inout_size to 0 before failure checks.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(uint64_t, char *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.class_of",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*despawn)(sco_plugin* self, uint64_t entity_id);`<br>Removes an entity you spawned here. SCO_OK starts the removal: the entity leaves the world within a few seconds (one that hasn't streamed in yet goes once it has), and the id is no longer yours. SCO_NOT_FOUND: not an entity you spawned here, or despawned already.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-despawn",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*despawn)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "sco_result Despawn(uint64_t id) const noexcept { return t_ && Covers(t_->size, offsetof(sc_entities_v1, despawn)) && t_->despawn ? t_->despawn(self_, id) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "public ScoResult Despawn(ulong id) => !Covers(48) || _t->despawn == null ? ScoResult.Unavailable : _t->despawn(Self, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "Removes an entity you spawned here. SCO_OK starts the removal: the entity leaves the world within a few seconds (one that hasn't streamed in yet goes once it has), and the id is no longer yours. SCO_NOT_FOUND: not an entity you spawned here, or despawned already.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.despawn",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*get_transform)(uint64_t entity_id, double out_pos[3], double out_rot_xyzw[4], uint64_t* out_zone_id);`<br>The entity's position (3 doubles) and rotation (x, y, z, w) in its zone's local frame, and that zone's id. Any out pointer may be NULL to skip it, not all of them. Outputs are zeroed on failure. SCO_NOT_FOUND: the entity isn't streamed in, or isn't in a zone. SCO_UNAVAILABLE: no \"game.entities.transform\". Read-only: last_error(NULL, ...). Implementation also FAILED for changed rotation slots or read fault; id 0 BAD_ARG.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-get-transform",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*get_transform)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_entities_v1, get_transform)) && t_->get_transform ? t_->get_transform(id, pos, rot, &zoneId) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "r = _t->get_transform(id, p, q, &z);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(e, sc_entities_v1, get_transform) ? e->get_transform(id, pos, rot, &zone) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "The entity's position (3 doubles) and rotation (x, y, z, w) in its zone's local frame, and that zone's id. Any out pointer may be NULL to skip it, not all of them. Outputs are zeroed on failure. SCO_NOT_FOUND: the entity isn't streamed in, or isn't in a zone. SCO_UNAVAILABLE: no \"game.entities.transform\". Read-only: last_error(NULL, ...). Implementation also FAILED for changed rotation slots or read fault; id 0 BAD_ARG.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(uint64_t, double *, double *, uint64_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.get_transform",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*keep)(sco_plugin* self, uint64_t entity_id);`<br>1.1. Releases your ownership of an entity you spawned here (see Keeping above): the host no longer despawns it when your plugin unloads or crashes, and set_transform and despawn by you are refused from now on, as for any entity you don't own. The entity itself is untouched. SCO_OK, once. SCO_BAD_ARG: a null or released self, id 0. SCO_NOT_FOUND: not an entity you spawned here and still own (kept or despawned already, or spawned another way), with a reason for last_error. SCO_UNAVAILABLE: no \"game.entities.spawn\". Call it right after spawn succeeds: the id is final at once, the entity needn't have streamed in. SCO_FAILED: a game.owned retained build cannot relinquish ownership; use remove_build for undo/clear and ordinary unload cleanup.",
      "callback_context": "unspecified",
      "cleanup": "For unretained legacy keep only: entity untouched and survives unload; no SDK undo/removal authority. Retained builds refuse keep and use game.owned removal/unload instead.",
      "examples": [],
      "id": "sc-entities-v1-keep",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*keep)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_->keep(self_, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "!Covers(88) || _t->keep == null ? ScoResult.Unavailable : _t->keep(Self, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 96,
      "ownership": "Relinquishes own game.entities spawn; no allocation transfer. Entity survives unload/crash, no longer counts against ownership quota; no longer movable/despawnable by this ownership.",
      "purpose": "1.1. Releases your ownership of an entity you spawned here (see Keeping above): the host no longer despawns it when your plugin unloads or crashes, and set_transform and despawn by you are refused from now on, as for any entity you don't own. The entity itself is untouched. SCO_OK, once. SCO_BAD_ARG: a null or released self, id 0. SCO_NOT_FOUND: not an entity you spawned here and still own (kept or despawned already, or spawned another way), with a reason for last_error. SCO_UNAVAILABLE: no \"game.entities.spawn\". Call it right after spawn succeeds: the id is final at once, the entity needn't have streamed in. SCO_FAILED: a game.owned retained build cannot relinquish ownership; use remove_build for undo/clear and ordinary unload cleanup.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 96`; 1.1",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.keep",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for self's last failed call (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). self NULL: the last failure of a call made without a plugin handle (alive's neighbours: class_of, get_transform, query_radius). Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "sco_result r = t_->last_error(who, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "return Storage.Sized((buf, size) => ((ScEntitiesV1*)t)->last_error((void*)who, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (GAME_MEMBER(e, sc_entities_v1, last_error) && e->last_error(NULL, msg, &size) == SCO_OK && msg[0]) { lua_pushstring(L, msg); return 3; }"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "stopped-service refusal unspecified (no started check).",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 88,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "The reason for self's last failed call (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). self NULL: the last failure of a call made without a plugin handle (alive's neighbours: class_of, get_transform, query_radius). Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released non-NULL self or buffer; TOO_MANY required bytes. NULL self selects no-self failures; stopped-service refusal unspecified (no started check).",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 88`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.last_error",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*query_radius)(uint64_t zone_id, const double pos[3], double radius, const char* class_filter, uint64_t* out_ids, uint32_t max, uint32_t* out_count, uint32_t* out_more);`<br>Ids of streamed-in entities within radius metres of pos in zone zone_id's frame, whose class matches class_filter (a class name or a \"PREFIX*\"; NULL or \"\" = any class). Up to max ids are written to out_ids (max 0 counts only); *out_count = how many were written and *out_more = how many matched but didn't fit. SCO_BAD_ARG: a null pos, out_count or out_more, a null out_ids with max &gt; 0, zone 0, a radius that isn't finite and positive, a filter that isn't a class name or prefix. SCO_NOT_FOUND: the zone isn't streamed in. SCO_FAILED: the walk faulted or saw more than 65536 entities. SCO_UNAVAILABLE: no \"game.entities.query_radius\" on this game build, or while its in-game check is pending (docs/game-services.md). Read-only: last_error(NULL, ...).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-query-radius",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*query_radius)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_entities_v1, query_radius)) && t_->query_radius ? t_->query_radius(zoneId, pos, radius, classFilter, ids, max, &count, &more) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "r = _t->query_radius(zoneId, p, radius, f, o, (uint)ids.Length, &c, &m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 80,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "Ids of streamed-in entities within radius metres of pos in zone zone_id's frame, whose class matches class_filter (a class name or a \"PREFIX*\"; NULL or \"\" = any class). Up to max ids are written to out_ids (max 0 counts only); *out_count = how many were written and *out_more = how many matched but didn't fit. SCO_BAD_ARG: a null pos, out_count or out_more, a null out_ids with max &gt; 0, zone 0, a radius that isn't finite and positive, a filter that isn't a class name or prefix. SCO_NOT_FOUND: the zone isn't streamed in. SCO_FAILED: the walk faulted or saw more than 65536 entities. SCO_UNAVAILABLE: no \"game.entities.query_radius\" on this game build, or while its in-game check is pending (docs/game-services.md). Read-only: last_error(NULL, ...).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(uint64_t, const double *, double, const char *, uint64_t *, uint32_t, uint32_t *, uint32_t *)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.query_radius",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_transform)(sco_plugin* self, uint64_t entity_id, uint64_t zone_id, const double pos[3], const double rot_xyzw[4]);`<br>Moves and turns an entity you may move (see Moving above): pos and rot are in zone zone_id's local frame (any streamed-in zone; the host converts to the entity's own zone). rot is normalised. SCO_BAD_ARG: a null or released self, id 0, a null pos or rot, a position that isn't finite or a zero rotation. SCO_NOT_FOUND: not streamed in yet (a fresh spawn takes a few seconds: wait for alive), or a zone that isn't. SCO_UNAVAILABLE: no \"game.entities.transform\". SCO_FAILED: not yours to move, or the game refused.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-set-transform",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*set_transform)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_entities_v1, set_transform)) && t_->set_transform ? t_->set_transform(self_, id, zoneId, pos, rot) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "return _t->set_transform(Self, id, zoneId, p, q);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "Moves and turns an entity you may move (see Moving above): pos and rot are in zone zone_id's local frame (any streamed-in zone; the host converts to the entity's own zone). rot is normalised. SCO_BAD_ARG: a null or released self, id 0, a null pos or rot, a position that isn't finite or a zero rotation. SCO_NOT_FOUND: not streamed in yet (a fresh spawn takes a few seconds: wait for alive), or a zone that isn't. SCO_UNAVAILABLE: no \"game.entities.transform\". SCO_FAILED: not yours to move, or the game refused.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, const double *, const double *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.set_transform",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*spawn)(sco_plugin* self, const char* entity_class, uint64_t zone_id, const double pos[3], const double rot_xyzw[4], uint64_t* out_id);`<br>Spawns an entity of entity_class (a class name, as in sc-offline's npcs.txt or spawn.entities) at pos, facing rot, in zone zone_id's local frame: anywhere, not only near the player. *out_id = the new entity id, 0 on failure. The id is final at once; the entity streams in a few seconds later. It is yours (see Ownership above). SCO_BAD_ARG: a null or released self, a null class, pos, rot or out_id, zone 0, or a position that isn't finite or a zero rotation. SCO_NOT_FOUND: the zone isn't streamed in, or the class doesn't exist on this game build. SCO_TOO_MANY: SC_ENTITIES_MAX_OWNED are alive. SCO_UNAVAILABLE: no \"game.entities.spawn\", or the host couldn't remove your entities when you unload. SCO_FAILED: the game refused or faulted.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; owned entities removed and watches ended on ordinary unload/non-retained crash cleanup, except kept entities. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sc-entities-v1-spawn",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*spawn)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_entities_v1, spawn)) && t_->spawn ? t_->spawn(self_, entityClass, zoneId, pos, rot, &id) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "r = _t->spawn(Self, c, zoneId, p, q, &n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified except unwatch in callback.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "Spawns an entity of entity_class (a class name, as in sc-offline's npcs.txt or spawn.entities) at pos, facing rot, in zone zone_id's local frame: anywhere, not only near the player. *out_id = the new entity id, 0 on failure. The id is final at once; the entity streams in a few seconds later. It is yours (see Ownership above). SCO_BAD_ARG: a null or released self, a null class, pos, rot or out_id, zone 0, or a position that isn't finite or a zero rotation. SCO_NOT_FOUND: the zone isn't streamed in, or the class doesn't exist on this game build. SCO_TOO_MANY: SC_ENTITIES_MAX_OWNED are alive. SCO_UNAVAILABLE: no \"game.entities.spawn\", or the host couldn't remove your entities when you unload. SCO_FAILED: the game refused or faulted.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint64_t, const double *, const double *, uint64_t *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.spawn",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere, alive returns 0); last_error any thread. Recursive reentrancy unspecified except unwatch in callback.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*unwatch)(sco_plugin* self, uint64_t watch_id);`<br>Ends a watch you registered; fn isn't called again once this returns. SCO_NOT_FOUND: not your watch, or ended already.",
      "callback_context": "unspecified",
      "cleanup": "May be called inside callback; no further event after successful return. Does not interrupt current callback.",
      "examples": [],
      "id": "sc-entities-v1-unwatch",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*unwatch)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "sco_result Unwatch(uint64_t watchId) const noexcept { return t_ && Covers(t_->size, offsetof(sc_entities_v1, unwatch)) && t_->unwatch ? t_->unwatch(self_, watchId) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "public ScoResult Unwatch(ulong watchId) => !Covers(64) || _t->unwatch == null ? ScoResult.Unavailable : _t->unwatch(Self, watchId);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Other reentrancy unspecified.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 72,
      "ownership": "Caller buffers; no allocation crosses boundary. Host owns entity/watch tracking; IDs are session values. Internal allocation unspecified.",
      "purpose": "Ends a watch you registered; fn isn't called again once this returns. SCO_NOT_FOUND: not your watch, or ended already.",
      "reentrancy": "allowed inside own callback; no further event after return.",
      "results": "BAD_ARG invalid/released self; WRONG_THREAD; NOT_FOUND no own active watch; valid watch removed even without capability/started gate (implementation).",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.unwatch",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only; allowed inside own callback; no further event after return. Other reentrancy unspecified.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*watch)(sco_plugin* self, uint32_t what, const char* type, sc_entity_watch_fn fn, void* ctx, uint64_t* out_watch_id);`<br>Calls fn(ctx, what, id, class) on the game thread for every entity of `type` that streams in or out (`what`: SC_ENTITY_STREAMED_IN, SC_ENTITY_STREAMED_OUT or both ORed), until unwatch or until your plugin unloads. *out_watch_id = the watch's id (never 0). type: an entity class name (\"AEGS_Avenger_Titan\"), matched exactly and case-sensitively, or a class prefix ending in one '*' (\"AEGS_*\"). The host matches the type before calling you, so you pay only for what you asked about. Refused with SCO_BAD_ARG, and a reason: NULL, empty, a lone \"*\", a '*' that isn't last (\"A*B\", \"**\"), more than SC_ENTITIES_MAX_TYPE_LEN characters, anything but printable ASCII or '?', a `what` with no known bit, a null self, fn or out_watch_id. SCO_TOO_MANY: SC_ENTITIES_MAX_WATCHES exist. SCO_UNAVAILABLE: no \"game.entities.watch\" on this build, or while the hooks are unconfirmed; see docs/game-services.md. Events reach fn a tick after they happen, in order; if a plugin can't keep up, the oldest are dropped.",
      "callback_context": "callback runs game thread and may call unwatch/unload",
      "cleanup": "unwatch/ordinary unload/non-retained crash cleanup ends delivery; callback may unwatch itself or unload without further events. Oldest queued events dropped under overflow (256 held per watch). Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Fault quarantine stops guarded delivery without removing the retained watch.",
      "examples": [],
      "id": "sc-entities-v1-watch",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_entities.h",
              "token": "(*watch)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_language_routes.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/entities.hpp",
              "token": "return t_ && Covers(t_->size, offsetof(sc_entities_v1, watch)) && t_->watch ? t_->watch(self_, what, type, fn, ctx, &watchId) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_entities.c",
            "tests/test_app.cpp",
            "tests/test_language_routes.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Entities.cs",
              "token": "r = _t->watch(Self, what, c, fn, ctx, &w);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: a Lua plugin owns no entities, so there is no spawn, despawn, move or watch."
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "{ \"alive\", L_ent_alive }, { \"class_of\", L_ent_class_of }, { \"get_transform\", L_ent_get_transform },"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "other reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 64,
      "ownership": "Filter copied; fn/ctx borrowed until unwatch/unload. Callback class_name borrowed for call only; streamed-out ID already gone.",
      "purpose": "Calls fn(ctx, what, id, class) on the game thread for every entity of `type` that streams in or out (`what`: SC_ENTITY_STREAMED_IN, SC_ENTITY_STREAMED_OUT or both ORed), until unwatch or until your plugin unloads. *out_watch_id = the watch's id (never 0). type: an entity class name (\"AEGS_Avenger_Titan\"), matched exactly and case-sensitively, or a class prefix ending in one '*' (\"AEGS_*\"). The host matches the type before calling you, so you pay only for what you asked about. Refused with SCO_BAD_ARG, and a reason: NULL, empty, a lone \"*\", a '*' that isn't last (\"A*B\", \"**\"), more than SC_ENTITIES_MAX_TYPE_LEN characters, anything but printable ASCII or '?', a `what` with no known bit, a null self, fn or out_watch_id. SCO_TOO_MANY: SC_ENTITIES_MAX_WATCHES exist. SCO_UNAVAILABLE: no \"game.entities.watch\" on this build, or while the hooks are unconfirmed; see docs/game-services.md. Events reach fn a tick after they happen, in order; if a plugin can't keep up, the oldest are dropped.",
      "reentrancy": "callback runs game thread and may call unwatch/unload",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE (alive: 0); invalid/released self: BAD_ARG. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.entities",
      "signature": "sco_result (*)(sco_plugin *, uint32_t, const char *, sc_entity_watch_fn, void *, uint64_t *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sc_entities.h",
      "symbol": "sc_entities_v1.watch",
      "table": "sc_entities_v1",
      "table_size": 96,
      "tests": [
        "tests/abi_game_entities.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_language_routes.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_language_routes.c",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only; callback runs game thread and may call unwatch/unload; other reentrancy unspecified.",
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND. Missing game readiness: 0.",
      "buffer_contract": "`int (*find_zone)(const char* name, sc_game_zone* out);`<br>Exact case-sensitive nonempty name of at most 95 bytes; copy the unique observed match only. Ambiguous, absent or possibly truncated names refuse. Does not discover unseen zones. out->size must be at least sizeof(sc_game_zone); preserve size and unknown caller tail. Outputs unchanged on 0.",
      "callback_context": "No callbacks.",
      "cleanup": "Synchronous read; no cancellation. Stop clears observations and expires epochs. Table lives until plugins unload; no calls after shutdown admission.",
      "examples": [],
      "id": "sc-game-spatial-v1-find-zone",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*find_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*find_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c",
            "tests/test_game_spatial.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic shared-logic fixtures only; Windows SEH/provider and live game not verified.",
        "Observed chains only, not exhaustive streamed-world discovery.",
        "System classification ungrounded: system_id is always unknown (0).",
        "Raw native calls do not promise process recovery after arbitrary pointer misuse or allocation failure."
      ],
      "member_extent": 32,
      "ownership": "Caller-owned copied records/buffers; opaque session IDs and epoch tokens, never pointers. Fixed 256-record storage; bounded temporary trees may allocate. No retained caller inputs or allocation transfer.",
      "purpose": "Exact case-sensitive nonempty name of at most 95 bytes; copy the unique observed match only. Ambiguous, absent or possibly truncated names refuse. Does not discover unseen zones. out->size must be at least sizeof(sc_game_zone); preserve size and unknown caller tail. Outputs unchanged on 0.",
      "reentrancy": "Recursive calls unsupported.",
      "results": "1 success; 0 invalid input, wrong thread, missing readiness, unreadable/unstreamed/incomplete ancestry, expired epoch, ambiguous name or quota refusal. All outputs unchanged on 0.",
      "service": "game.spatial",
      "signature": "int (*)(const char *, sc_game_zone *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_game_spatial.h",
      "symbol": "sc_game_spatial_v1.find_zone",
      "table": "sc_game_spatial_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_spatial.c",
        "tests/test_game_spatial.cpp"
      ],
      "thread_affinity": "Game thread only; non-reentrant; no callbacks.",
      "version_macro": "SC_GAME_SPATIAL_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND. Missing game readiness: 0.",
      "buffer_contract": "`int (*list_zones)(uint64_t epoch, uint32_t offset, sc_game_zone* out, uint32_t stride, uint32_t cap, uint32_t* out_count, uint32_t* out_more, uint64_t* out_epoch);`<br>Copied page sorted by zone ID from at most 256 explicitly observed zones, never exhaustive world discovery. epoch=0 selects current set; nonzero epoch must match. Tick refresh, additions/changes, invalidation and stop expire epochs. cap at most 64; stride is aligned to 8 bytes and in [144,4096]; every offered slot has size at least 144. cap=0 allows NULL out and counts remaining entries. offset may equal total. out_count is copied elements; out_more is remaining after this page; out_epoch pins later pages. Validate all slots before writing; preserve caller size and unknown tails. Outputs unchanged on 0.",
      "callback_context": "No callbacks.",
      "cleanup": "Synchronous read; no cancellation. Stop clears observations and expires epochs. Table lives until plugins unload; no calls after shutdown admission.",
      "examples": [],
      "id": "sc-game-spatial-v1-list-zones",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*list_zones)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*list_zones)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c",
            "tests/test_game_spatial.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic shared-logic fixtures only; Windows SEH/provider and live game not verified.",
        "Observed chains only, not exhaustive streamed-world discovery.",
        "System classification ungrounded: system_id is always unknown (0).",
        "Raw native calls do not promise process recovery after arbitrary pointer misuse or allocation failure."
      ],
      "member_extent": 40,
      "ownership": "Caller-owned copied records/buffers; opaque session IDs and epoch tokens, never pointers. Fixed 256-record storage; bounded temporary trees may allocate. No retained caller inputs or allocation transfer.",
      "purpose": "Copied page sorted by zone ID from at most 256 explicitly observed zones, never exhaustive world discovery. epoch=0 selects current set; nonzero epoch must match. Tick refresh, additions/changes, invalidation and stop expire epochs. cap at most 64; stride is aligned to 8 bytes and in [144,4096]; every offered slot has size at least 144. cap=0 allows NULL out and counts remaining entries. offset may equal total. out_count is copied elements; out_more is remaining after this page; out_epoch pins later pages. Validate all slots before writing; preserve caller size and unknown tails. Outputs unchanged on 0.",
      "reentrancy": "Recursive calls unsupported.",
      "results": "1 success; 0 invalid input, wrong thread, missing readiness, unreadable/unstreamed/incomplete ancestry, expired epoch, ambiguous name or quota refusal. All outputs unchanged on 0.",
      "service": "game.spatial",
      "signature": "int (*)(uint64_t, uint32_t, sc_game_zone *, uint32_t, uint32_t, uint32_t *, uint32_t *, uint64_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_game_spatial.h",
      "symbol": "sc_game_spatial_v1.list_zones",
      "table": "sc_game_spatial_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_spatial.c",
        "tests/test_game_spatial.cpp"
      ],
      "thread_affinity": "Game thread only; non-reentrant; no callbacks.",
      "version_macro": "SC_GAME_SPATIAL_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND. Missing game readiness: 0.",
      "buffer_contract": "`int (*pose_to_zone)(uint64_t from, uint64_t to, const double pos[3], const double rot_xyzw[4], double out_pos[3], double out_rot_xyzw[4]);`<br>Convert finite position (metres) and nonzero quaternion x/y/z/w between complete readable rigid zone frames, normalizing rotation; world frame is 0. Position conversion stops at the common ancestor. Outputs may alias corresponding inputs; output arrays must not overlap. Null/nonfinite input or norm below 1e-12 refuses. Outputs unchanged on 0.",
      "callback_context": "No callbacks.",
      "cleanup": "Synchronous read; no cancellation. Stop clears observations and expires epochs. Table lives until plugins unload; no calls after shutdown admission.",
      "examples": [],
      "id": "sc-game-spatial-v1-pose-to-zone",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*pose_to_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*pose_to_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c",
            "tests/test_game_spatial.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic shared-logic fixtures only; Windows SEH/provider and live game not verified.",
        "Observed chains only, not exhaustive streamed-world discovery.",
        "System classification ungrounded: system_id is always unknown (0).",
        "Raw native calls do not promise process recovery after arbitrary pointer misuse or allocation failure."
      ],
      "member_extent": 16,
      "ownership": "Caller-owned copied records/buffers; opaque session IDs and epoch tokens, never pointers. Fixed 256-record storage; bounded temporary trees may allocate. No retained caller inputs or allocation transfer.",
      "purpose": "Convert finite position (metres) and nonzero quaternion x/y/z/w between complete readable rigid zone frames, normalizing rotation; world frame is 0. Position conversion stops at the common ancestor. Outputs may alias corresponding inputs; output arrays must not overlap. Null/nonfinite input or norm below 1e-12 refuses. Outputs unchanged on 0.",
      "reentrancy": "Recursive calls unsupported.",
      "results": "1 success; 0 invalid input, wrong thread, missing readiness, unreadable/unstreamed/incomplete ancestry, expired epoch, ambiguous name or quota refusal. All outputs unchanged on 0.",
      "service": "game.spatial",
      "signature": "int (*)(uint64_t, uint64_t, const double *, const double *, double *, double *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_game_spatial.h",
      "symbol": "sc_game_spatial_v1.pose_to_zone",
      "table": "sc_game_spatial_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_spatial.c",
        "tests/test_game_spatial.cpp"
      ],
      "thread_affinity": "Game thread only; non-reentrant; no callbacks.",
      "version_macro": "SC_GAME_SPATIAL_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND. Missing game readiness: 0.",
      "buffer_contract": "`int (*zone_record)(uint64_t zone_id, sc_game_zone* out);`<br>Observe one nonzero streamed zone ID and its complete ancestry, then copy a size-prefixed 144-byte record. out->size must be at least sizeof(sc_game_zone); preserve size and unknown caller tail. parent_id is direct parent; root_id is the observed outermost zone, not a certified system. system_id remains 0 with SYSTEM_UNKNOWN. Full 95-byte copied names conservatively set NAME_TRUNCATED. Outputs unchanged on 0.",
      "callback_context": "No callbacks.",
      "cleanup": "Synchronous read; no cancellation. Stop clears observations and expires epochs. Table lives until plugins unload; no calls after shutdown admission.",
      "examples": [],
      "id": "sc-game-spatial-v1-zone-record",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*zone_record)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "(*zone_record)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_spatial.c",
            "tests/test_game_spatial.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_game_spatial.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic shared-logic fixtures only; Windows SEH/provider and live game not verified.",
        "Observed chains only, not exhaustive streamed-world discovery.",
        "System classification ungrounded: system_id is always unknown (0).",
        "Raw native calls do not promise process recovery after arbitrary pointer misuse or allocation failure."
      ],
      "member_extent": 24,
      "ownership": "Caller-owned copied records/buffers; opaque session IDs and epoch tokens, never pointers. Fixed 256-record storage; bounded temporary trees may allocate. No retained caller inputs or allocation transfer.",
      "purpose": "Observe one nonzero streamed zone ID and its complete ancestry, then copy a size-prefixed 144-byte record. out->size must be at least sizeof(sc_game_zone); preserve size and unknown caller tail. parent_id is direct parent; root_id is the observed outermost zone, not a certified system. system_id remains 0 with SYSTEM_UNKNOWN. Full 95-byte copied names conservatively set NAME_TRUNCATED. Outputs unchanged on 0.",
      "reentrancy": "Recursive calls unsupported.",
      "results": "1 success; 0 invalid input, wrong thread, missing readiness, unreadable/unstreamed/incomplete ancestry, expired epoch, ambiguous name or quota refusal. All outputs unchanged on 0.",
      "service": "game.spatial",
      "signature": "int (*)(uint64_t, sc_game_zone *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_game_spatial.h",
      "symbol": "sc_game_spatial_v1.zone_record",
      "table": "sc_game_spatial_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_spatial.c",
        "tests/test_game_spatial.cpp"
      ],
      "thread_affinity": "Game thread only; non-reentrant; no callbacks.",
      "version_macro": "SC_GAME_SPATIAL_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.hangar.atc_cancel OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*atc_cancel_request)(sco_plugin* self, uint64_t atc_id);`<br>Withdraws the local player's pending request at the air traffic controller atc_id (the game's own request cancel). SCO_BAD_ARG: an id of 0. SCO_NOT_FOUND: that entity has no ATC data. SCO_FAILED: you're not spawned, or the game faulted. game.hangar.atc_cancel.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; a lift request or ATC cancel is one call and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-hangar-v1-atc-cancel-request",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_hangar.h",
              "token": "(*atc_cancel_request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_hangar.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/hangar.hpp",
              "token": "return t_->atc_cancel_request(self_, atcId);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Hangar.cs",
              "token": "_t->atc_cancel_request(Self, atcId);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.hangar routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "Withdraws the local player's pending request at the air traffic controller atc_id (the game's own request cancel). SCO_BAD_ARG: an id of 0. SCO_NOT_FOUND: that entity has no ATC data. SCO_FAILED: you're not spawned, or the game faulted. game.hangar.atc_cancel.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.hangar.atc_cancel OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.hangar",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_hangar.h",
      "symbol": "sc_hangar_v1.atc_cancel_request",
      "table": "sc_hangar_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_hangar.c",
        "tests/test_hangar.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_HANGAR_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; a lift request or ATC cancel is one call and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-hangar-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_hangar.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_hangar.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/hangar.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Hangar.cs",
              "token": "return Storage.Sized((buf, size) => ((ScHangarV1*)t)->last_error((void*)self, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.hangar routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. On the game thread with a loaded self: your own last error; otherwise the thread's last refusal.",
      "service": "game.hangar",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_hangar.h",
      "symbol": "sc_hangar_v1.last_error",
      "table": "sc_hangar_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_hangar.c",
        "tests/test_hangar.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_HANGAR_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.hangar.lift OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*lift_of_landing_area)(sco_plugin* self, uint64_t landing_area_id, uint64_t* out_lift_id);`<br>*out_lift_id = the entity id of the ship lift that serves the landing area landing_area_id: the lift whose name matches the landing area's and that is in the landing area's zone. SCO_BAD_ARG: an id of 0, out_lift_id NULL, or the entity isn't a landing area. SCO_NOT_FOUND: the landing area isn't streamed in, or no lift goes with it. SCO_FAILED: the game faulted. game.hangar.lift.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; a lift request or ATC cancel is one call and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-hangar-v1-lift-of-landing-area",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_hangar.h",
              "token": "(*lift_of_landing_area)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_hangar.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/hangar.hpp",
              "token": "return t_->lift_of_landing_area(self_, landingAreaId, &lift);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Hangar.cs",
              "token": "_t->lift_of_landing_area(Self, landingAreaId, &l);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.hangar routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "*out_lift_id = the entity id of the ship lift that serves the landing area landing_area_id: the lift whose name matches the landing area's and that is in the landing area's zone. SCO_BAD_ARG: an id of 0, out_lift_id NULL, or the entity isn't a landing area. SCO_NOT_FOUND: the landing area isn't streamed in, or no lift goes with it. SCO_FAILED: the game faulted. game.hangar.lift.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.hangar.lift OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.hangar",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_hangar.h",
      "symbol": "sc_hangar_v1.lift_of_landing_area",
      "table": "sc_hangar_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_hangar.c",
        "tests/test_hangar.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_HANGAR_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.hangar.lift OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*lift_request)(sco_plugin* self, uint64_t lift_id, uint32_t op);`<br>Asks the ship lift lift_id (an id from lift_of_landing_area) to open or close (sc_hangar_lift_op). SCO_OK means the request was handed to the game, not that the lift has moved. SCO_BAD_ARG: an id of 0, an unknown op, or the entity isn't a ship lift. SCO_NOT_FOUND: the lift isn't streamed in. SCO_FAILED: the game faulted. game.hangar.lift.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; a lift request or ATC cancel is one call and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-hangar-v1-lift-request",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_hangar.h",
              "token": "(*lift_request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_hangar.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/hangar.hpp",
              "token": "return t_->lift_request(self_, liftId, static_cast<uint32_t>(op));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Hangar.cs",
              "token": "_t->lift_request(Self, liftId, (uint)op);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.hangar routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "Asks the ship lift lift_id (an id from lift_of_landing_area) to open or close (sc_hangar_lift_op). SCO_OK means the request was handed to the game, not that the lift has moved. SCO_BAD_ARG: an id of 0, an unknown op, or the entity isn't a ship lift. SCO_NOT_FOUND: the lift isn't streamed in. SCO_FAILED: the game faulted. game.hangar.lift.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.hangar.lift OFF (the default): UNAVAILABLE without an engine call; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.hangar",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_hangar.h",
      "symbol": "sc_hangar_v1.lift_request",
      "table": "sc_hangar_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_hangar.c",
        "tests/test_hangar.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_HANGAR_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND. Published table does not imply capability; production game.loadout.apply stays false.",
      "buffer_contract": "`sco_result (*apply)(sco_plugin* self, const sc_loadout_request* request, sc_loadout_report* report);`<br>Synchronous typed offline local-player equip: 1..16 unique slots (1.0 body slots 1..7; 1.1 adds weapon and multitool slots 8..21), fixed ASCII item classes, per-slot APPLIED/UNSUPPORTED/ITEM_MISSING/FAILED/UNAVAILABLE and applied count. Entire batch structural validation precedes engine calls; partial apply is not rolled back.",
      "callback_context": "No plugin callbacks. Internal game-pack backend callbacks are synchronous; caller pointers are not retained.",
      "cleanup": "No pending requests, ownership tickets, persistence or unload rollback. Successful equip survives consumer unload. Table session-lifetime; stop withdraws after consumers unload. Backend fault disables apply until process restart; do not retry cached calls after shutdown.",
      "examples": [],
      "id": "sc-loadout-v1-apply",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_loadout.h",
              "token": "(*apply)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_loadout.c",
            "tests/game_contracts/loadout/consumer.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/loadout.hpp",
              "token": "return table_->apply(self_, &request, &report);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/game_contracts/loadout/routes.cpp",
            "tests/game_contracts/loadout/test_loadout.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/game/loadout.md",
              "token": "C# is unsupported for loadout 1.0"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/game/loadout.md",
              "token": "Lua mutation is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production typed engine equip/slot mapping is unverified and disabled. No XML loader fallback, account inventory or entitlements.",
        "MSVC calling conventions/SEH and game acceptance not verified locally.",
        "No claim of native corruption recovery; portable test catches C++ exceptions only."
      ],
      "member_extent": 16,
      "ownership": "Caller owns full-size request/report and frozen item array (exact item_stride). No allocation transfer; inputs copied to bounded stack storage; pointers borrowed only during call. Only local player is targeted.",
      "purpose": "Synchronous typed offline local-player equip: 1..16 unique slots (1.0 body slots 1..7; 1.1 adds weapon and multitool slots 8..21), fixed ASCII item classes, per-slot APPLIED/UNSUPPORTED/ITEM_MISSING/FAILED/UNAVAILABLE and applied count. Entire batch structural validation precedes engine calls; partial apply is not rolled back.",
      "reentrancy": "Recursive apply returns UNAVAILABLE with per-slot UNAVAILABLE; no nested backend call. Backend Start returns Unavailable and Stop is ignored during apply.",
      "results": "BAD_ARG for null/foreign/released self, short structs, zero count, wrong stride, nonzero reserved fields, duplicate slots or malformed class; TOO_MANY above 16. Structural refusals leave report unchanged. UNAVAILABLE for missing engine/verification/capability/offline admission, with per-slot UNAVAILABLE. OK iff all applied; FAILED for partial/slot refusals or guarded backend fault.",
      "service": "game.loadout",
      "signature": "sco_result (*)(sco_plugin *, const sc_loadout_request *, sc_loadout_report *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_loadout.h",
      "symbol": "sc_loadout_v1.apply",
      "table": "sc_loadout_v1",
      "table_size": 16,
      "tests": [
        "tests/abi_game_loadout.c",
        "tests/game_contracts/loadout/consumer.c",
        "tests/game_contracts/loadout/routes.cpp",
        "tests/game_contracts/loadout/test_loadout.cpp",
        "tests/game_contracts/loadout/native.cpp",
        "tests/game_contracts/loadout/test_metadata.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD without output or engine access.",
      "version_macro": "SC_LOADOUT_VERSION_1_1"
    },
    {
      "absent_capability": "game.mining remains false by default. Accepted request intent does not imply an available or active engine adapter.",
      "buffer_contract": "`sco_result (*request)(sco_plugin* self, uint32_t enabled);`<br>enabled is exactly 0 or 1. Accept or remove owner-scoped intent; repeated requests are idempotent. OK accepts intent even when engine/admission/hook is unavailable; read state to distinguish active. Disable also removes intent after a fault latch.",
      "callback_context": "No plugin callback; worker invokes host-owned process-retained backend only.",
      "cleanup": "Disable/unload removes only that owner intent. Stop clears all intent and withdraws the service; detour, trampoline and callbacks remain process-retained in pass-through mode. Fault latch requires restart.",
      "examples": [],
      "id": "sc-mining-v1-request",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_mining.h",
              "token": "(*request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_catalogue_mining.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_mining.h",
              "token": "(*request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_mining.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.mining routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.mining routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production native adapter unavailable; not run in game.",
        "Portable provider/release fixture is synthetic, not Windows SEH or native detour execution.",
        "Process counters are independent atomic observations, not a transactional snapshot.",
        "No C# or Lua route."
      ],
      "member_extent": 16,
      "ownership": "Up to 64 live owners retain independent intent; worker sees only aggregate count. Caller owns copied output; no native pointer or allocation transfer.",
      "purpose": "enabled is exactly 0 or 1. Accept or remove owner-scoped intent; repeated requests are idempotent. OK accepts intent even when engine/admission/hook is unavailable; read state to distinguish active. Disable also removes intent after a fault latch.",
      "reentrancy": "Public calls during backend admission/install are refused with UNAVAILABLE.",
      "results": "OK accepted intent, not engine acceptance; BAD_ARG invalid/released self or enabled; WRONG_THREAD; UNAVAILABLE stopped/runtime-stopping or reentrant call; FAILED full 64-owner registry.",
      "service": "game.mining",
      "signature": "sco_result (*)(sco_plugin *, uint32_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_mining.h",
      "symbol": "sc_mining_v1.request",
      "table": "sc_mining_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_catalogue_mining.c",
        "tests/test_mining.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before owner/state access. Worker promotion never calls plugins.",
      "version_macro": "SC_MINING_SERVICE_VERSION"
    },
    {
      "absent_capability": "game.mining remains false by default. Accepted request intent does not imply an available or active engine adapter.",
      "buffer_contract": "`sco_result (*state)(sco_plugin* self, sc_mining_state* out);`<br>out.size must cover 40 bytes. Copy owner requested/active, refusal block and process cells/promoted/faults; successful observation can report refusal. Output size becomes 40; unknown tail untouched. OFF=0 is disabled or active without block; promoted counts forwarded bits, not spawned/harvested entities.",
      "callback_context": "No plugin callback; worker invokes host-owned process-retained backend only.",
      "cleanup": "Disable/unload removes only that owner intent. Stop clears all intent and withdraws the service; detour, trampoline and callbacks remain process-retained in pass-through mode. Fault latch requires restart.",
      "examples": [],
      "id": "sc-mining-v1-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_mining.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_catalogue_mining.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_mining.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_mining.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.mining routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.mining routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production native adapter unavailable; not run in game.",
        "Portable provider/release fixture is synthetic, not Windows SEH or native detour execution.",
        "Process counters are independent atomic observations, not a transactional snapshot.",
        "No C# or Lua route."
      ],
      "member_extent": 24,
      "ownership": "Up to 64 live owners retain independent intent; worker sees only aggregate count. Caller owns copied output; no native pointer or allocation transfer.",
      "purpose": "out.size must cover 40 bytes. Copy owner requested/active, refusal block and process cells/promoted/faults; successful observation can report refusal. Output size becomes 40; unknown tail untouched. OFF=0 is disabled or active without block; promoted counts forwarded bits, not spawned/harvested entities.",
      "reentrancy": "Public calls during backend admission/install are refused with UNAVAILABLE.",
      "results": "OK copied observation; BAD_ARG invalid/released self or null/short output; WRONG_THREAD; UNAVAILABLE stopped/runtime-stopping or reentrant call.",
      "service": "game.mining",
      "signature": "sco_result (*)(sco_plugin *, sc_mining_state *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_mining.h",
      "symbol": "sc_mining_v1.state",
      "table": "sc_mining_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_catalogue_mining.c",
        "tests/test_mining.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before owner/state access. Worker promotion never calls plugins.",
      "version_macro": "SC_MINING_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*abandon)(sco_plugin* self, uint64_t mission_id);`<br>Abandon an owned active mission once; repeated abandonment is a no-op. Completed missions refuse abandonment. Unload cancels local ownership; never retries uncertain native effects.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-abandon",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*abandon)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*abandon)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 56,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Abandon an owned active mission once; repeated abandonment is a no-op. Completed missions refuse abandonment. Unload cancels local ownership; never retries uncertain native effects.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.abandon",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*accept)(sco_plugin* self, const sc_mission_offer* offer, uint64_t key, uint64_t* out_mission);`<br>Accept the exact current broker/offer/generation with a nonzero owner/session idempotency key. Duplicate identical requests return the original handle without another effect; changed input with the same key is BAD_ARG. At most 64 retained acceptance receipts per session; no eviction.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-accept",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*accept)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*accept)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 32,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Accept the exact current broker/offer/generation with a nonzero owner/session idempotency key. Duplicate identical requests return the original handle without another effect; changed input with the same key is BAD_ARG. At most 64 retained acceptance receipts per session; no eviction.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, const sc_mission_offer *, uint64_t, uint64_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.accept",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*advance)(sco_plugin* self, uint64_t mission_id, uint32_t expected_phase);`<br>Advance an owned active mission only after all objectives in its current phase. Duplicate old phase is a no-op; last phase becomes completed. This never pays a reward.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-advance",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*advance)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*advance)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 48,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Advance an owned active mission only after all objectives in its current phase. Duplicate old phase is a no-op; last phase becomes completed. This never pays a reward.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.advance",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*ingest)(sco_plugin* self, const sc_mission_script* script);`<br>Copy bounded declarative user-authored mission data for a validated data-relative name. No filesystem/network/executable-script access. Atomic validation; malformed/unknown content fails before backend calls; identical registration is idempotent, changed content needs restart.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-ingest",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*ingest)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*ingest)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 64,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Copy bounded declarative user-authored mission data for a validated data-relative name. No filesystem/network/executable-script access. Atomic validation; malformed/unknown content fails before backend calls; identical registration is idempotent, changed content needs restart.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, const sc_mission_script *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.ingest",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*objective)(sco_plugin* self, uint64_t mission_id, uint32_t phase, uint32_t objective);`<br>Complete exactly the expected current phase/objective for an owned active mission. An already completed step is an idempotent no-op; forward skips, foreign handles and stale sessions are refused.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-objective",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*objective)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*objective)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 40,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Complete exactly the expected current phase/objective for an owned active mission. An already completed step is an idempotent no-op; forward skips, foreign handles and stale sessions are refused.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t, uint32_t)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.objective",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*offer)(sco_plugin* self, uint32_t index, sc_mission_offer* out);`<br>Bounded copied offline offer by index (0..255); NOT_FOUND at end. Caller output size must cover the whole record; size and unknown tails are preserved. No mutation authority.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-offer",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*offer)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*offer)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 16,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Bounded copied offline offer by index (0..255); NOT_FOUND at end. Caller output size must cover the whole record; size and unknown tails are preserved. No mutation authority.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, uint32_t, sc_mission_offer *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.offer",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing table: query_service NOT_FOUND; absent method/backend or unsafe admission: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*status)(sco_plugin* self, uint64_t mission_id, sc_mission_status* out);`<br>Copied sanitized mission status for nonzero opaque ID and current session. NOT_FOUND for unknown ID; caller output size must cover the record.",
      "callback_context": "Backend callbacks synchronous on game thread; pointers valid only during call.",
      "cleanup": "Consumers unload before Stop. Released owners lose mutation authority. No automatic persistence or replay of uncertain effects. Native faults permanently close admission until process restart.",
      "examples": [],
      "id": "sc-missions-v1-status",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*status)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_offline_missions.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_missions.h",
              "token": "(*status)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_offline_missions.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/offline-missions.md",
              "token": "C# and Lua bindings are unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No validated Windows engine adapter; synthetic/compile checked, not run in game.",
        "Uniform phase widths only; other mission kinds unavailable.",
        "No persistent receipt/store/import policy in game pack."
      ],
      "member_extent": 24,
      "ownership": "Caller-owned copied buffers; no allocation transfer. Mutations scoped to live plugin and current offline session.",
      "purpose": "Copied sanitized mission status for nonzero opaque ID and current session. NOT_FOUND for unknown ID; caller output size must cover the record.",
      "reentrancy": "Recursive calls and Stop/replacement during callbacks refused (FAILED).",
      "results": "OK on success; BAD_ARG invalid/short input or released handle; UNAVAILABLE absent backend/unsafe admission; NOT_FOUND unknown IDs; TOO_MANY bounded quota; FAILED refused progression/provider failure; CRASHED latches restart required. Outputs untouched on failure.",
      "service": "game.missions",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, sc_mission_status *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_missions.h",
      "symbol": "sc_missions_v1.status",
      "table": "sc_missions_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_offline_missions.c",
        "tests/test_offline_missions.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before backend access.",
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*forget)(sco_plugin* self, uint64_t ticket);`<br>Forget owner-scoped receipt to reclaim capacity; not cancellation, completion or renewed ownership.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-forget",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*forget)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*forget)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 56,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Forget owner-scoped receipt to reclaim capacity; not cancellation, completion or renewed ownership.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.forget",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*receipt)(sco_plugin* self, uint64_t ticket, sc_removal_receipt* out);`<br>Read owner-scoped REQUESTED initiation record, never alive-based completion. A short size-prefixed record is untouched; sufficient output payload clears on failure.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-receipt",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*receipt)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*receipt)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 48,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Read owner-scoped REQUESTED initiation record, never alive-based completion. A short size-prefixed record is untouched; sufficient output payload clears on failure.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, sc_removal_receipt *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.receipt",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*remove_build)(sco_plugin* self, uint64_t entity_id, uint64_t* out_ticket);`<br>Remove a retained caller-owned build placement through existing entities despawn; ticket 0 on refusal, SCO_OK is initiation only.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-remove-build",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_build)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_build)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 24,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Remove a retained caller-owned build placement through existing entities despawn; ticket 0 on refusal, SCO_OK is initiation only.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.remove_build",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*remove_npc)(sco_plugin* self, uint64_t npc_id, uint64_t* out_ticket);`<br>Remove only caller-owned game.actors NPCs through actors despawn; no entity/spawn_as/player ownership union. Ticket 0 on refusal; SCO_OK is initiation only.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-remove-npc",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_npc)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_npc)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 32,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Remove only caller-owned game.actors NPCs through actors despawn; no entity/spawn_as/player ownership union. Ticket 0 on refusal; SCO_OK is initiation only.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.remove_npc",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*remove_seat_npc)(sco_plugin* self, uint64_t ship, uint32_t seat_index, uint64_t expected_npc, uint64_t* out_ticket);`<br>Fresh seat occupant must match expected actors-owned NPC; foreign/player/unknown occupants are refused. Ticket 0 on refusal; SCO_OK is initiation only.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-remove-seat-npc",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_seat_npc)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*remove_seat_npc)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 40,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Fresh seat occupant must match expected actors-owned NPC; foreign/player/unknown occupants are refused. Ticket 0 on refusal; SCO_OK is initiation only.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t, uint64_t, uint64_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.remove_seat_npc",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; prerequisite operations may be UNAVAILABLE.",
      "buffer_contract": "`sco_result (*retain_build)(sco_plugin* self, uint64_t entity_id);`<br>Idempotently mark an existing caller-owned game.entities spawn as retained for loaded-plugin undo/clear; keep refuses it and unload removes it.",
      "callback_context": "No caller callbacks. Existing game-pack primitives only.",
      "cleanup": "Ordinary unload removes retained placements/NPCs through existing hooks and clears receipts. No across-reload persistence; retained-provider faults require restart and skip resource hooks.",
      "examples": [],
      "id": "sc-owned-v1-retain-build",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*retain_build)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_owned.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_owned.h",
              "token": "(*retain_build)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_owned_removal.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "C# game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/owned-removal.md",
              "token": "Lua game.owned is unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic providers only; real engine and Windows/MSVC runtime not verified.",
        "No confirmed-disappearance detector; receipts never advance from REQUESTED.",
        "C# and Lua routes unsupported."
      ],
      "member_extent": 16,
      "ownership": "Explicit retained entities ownership while loaded; NPC authority is actors-only. Owner-scoped receipts, caller outputs; fixed global bounds of 1024 each, no cross-boundary allocation.",
      "purpose": "Idempotently mark an existing caller-owned game.entities spawn as retained for loaded-plugin undo/clear; keep refuses it and unload removes it.",
      "reentrancy": "No recursive reentry.",
      "results": "BAD_ARG invalid/released self or arguments; NOT_FOUND foreign/stale authority; UNAVAILABLE missing/partial/null prerequisite method; FAILED changed seat; TOO_MANY full tracking. Underlying refusal propagates; SCO_OK removal is initiation only.",
      "service": "game.owned",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_owned.h",
      "symbol": "sc_owned_v1.retain_build",
      "table": "sc_owned_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_game_owned.c",
        "tests/test_owned_removal.cpp",
        "tools/test_g9_owned_contract.py"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No recursive reentry.",
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    {
      "absent_capability": "Absent service: query_service NOT_FOUND; present disabled operation: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*spawn)(sco_plugin* self, const char* content_path, uint64_t zone_id, const double pos[3], const double rot_xyzw[4], uint64_t* out_id);`<br>Canonical ObjectContainers content-relative .socpak path (511 bytes max), finite zone-local pose and normalized quaternion. Caller-owned final entity ID, zero on failure; success means spawn initiation only. Shared 1024 owned quota and 128 own entities maximum, checked before mutation. Pending prefab ownership is never pruned by alive=0. Capability game.entities.prefabs is enabled by default for R1 by owner approval; Windows/SEH/streamed cleanup NOT VERIFIED.",
      "callback_context": "No plugin callbacks. Host-only provider callbacks synchronous, bounded and nonthrowing.",
      "cleanup": "Use existing entities despawn/set_transform and game.owned retention/removal. Ordinary owner unload removes pending/streamed owned prefab via delayed removal primitive; no materialization/removal completion promise. Known ID on provider failure remains tracked for cleanup. Fault-retained native provider follows restart-required lifetime contract.",
      "examples": [],
      "id": "sc-prefabs-v1-spawn",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_prefabs.h",
              "token": "(*spawn)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_prefabs.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/prefabs.hpp",
              "token": "table_->spawn("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_prefabs.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/prefabs.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/prefabs.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Windows engine/SEH/gameplay and streamed cleanup not verified.",
        "Owner-approved R1 default enabled; portable provider policy is synthetic evidence only, not Windows/SEH/gameplay acceptance.",
        "No packaged content or filesystem/online path access."
      ],
      "member_extent": 16,
      "ownership": "Live caller owns result through existing game.entities ledger. Inputs copied for synchronous provider call, host-session table borrowed; no cross-boundary allocation.",
      "purpose": "Canonical ObjectContainers content-relative .socpak path (511 bytes max), finite zone-local pose and normalized quaternion. Caller-owned final entity ID, zero on failure; success means spawn initiation only. Shared 1024 owned quota and 128 own entities maximum, checked before mutation. Pending prefab ownership is never pruned by alive=0. Capability game.entities.prefabs is enabled by default for R1 by owner approval; Windows/SEH/streamed cleanup NOT VERIFIED.",
      "reentrancy": "No recursive reentry; host adapter must not call plugins.",
      "results": "BAD_ARG invalid handle/path/pose/output; WRONG_THREAD; TOO_MANY quota; NOT_FOUND zone/content/class; UNAVAILABLE disabled capability or cleanup; FAILED provider refusal/fault. Output ID zero on failure.",
      "service": "game.prefabs",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint64_t, const double *, const double *, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_prefabs.h",
      "symbol": "sc_prefabs_v1.spawn",
      "table": "sc_prefabs_v1",
      "table_size": 16,
      "tests": [
        "tests/abi_prefabs.c",
        "tests/test_prefabs.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD otherwise.",
      "version_macro": "SC_PREFABS_VERSION_1_0"
    },
    {
      "absent_capability": "Disabled broker, absent admission/owner cleanup or failed registration leaves game.private_session false/unavailable. Enabled default is loopback-only and opens no socket before explicit Host/Join.",
      "buffer_contract": "`sco_result (*get_state)(sc_private_session_state_v1* out);`<br>out.size must cover 16 bytes; copy session state, peer count and configured host max_peers (0 for joiner/idle unknown). No owner handle is required. Output size becomes 16; unknown tail untouched. Admission loss leaves the session and returns UNAVAILABLE without copying output.",
      "callback_context": "No plugin callback; offline/EAC inspection and transport are host-owned.",
      "cleanup": "Requesting-owner unload, explicit leave, admission loss or host stop leaves session. Stop withdraws service. Credentials are volatile backend state, not plugin-controlled persistent storage.",
      "examples": [],
      "id": "sc-private-session-v1-get-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*get_state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*get_state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c",
            "tests/test_net_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Portable broker/provider tests use synthetic transport and forbid sockets; not native UDP or gameplay acceptance.",
        "OK Host/Join is operation acceptance, not authenticated peer connection.",
        "No C# or Lua route.",
        "Fresh local UI consent is a caller obligation; startup/settings/peer replay and automatic retries must not assert it."
      ],
      "member_extent": 40,
      "ownership": "Host owns one session and its requesting owner; request strings are borrowed for the call and copied into host storage. Plugins receive no socket/bind/allowlist authority. Caller owns copied state.",
      "purpose": "out.size must cover 16 bytes; copy session state, peer count and configured host max_peers (0 for joiner/idle unknown). No owner handle is required. Output size becomes 16; unknown tail untouched. Admission loss leaves the session and returns UNAVAILABLE without copying output.",
      "reentrancy": "Nested calls during broker operations are refused with UNAVAILABLE.",
      "results": "OK copied state; BAD_ARG null/short output; WRONG_THREAD; UNAVAILABLE absent broker, runtime stopping, reentrant call or admission loss.",
      "service": "game.private_session",
      "signature": "sco_result (*)(sc_private_session_state_v1 *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_private_session.h",
      "symbol": "sc_private_session_v1.get_state",
      "table": "sc_private_session_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_private_session.c",
        "tests/test_net_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access.",
      "version_macro": "SC_PRIVATE_SESSION_VERSION"
    },
    {
      "absent_capability": "Disabled broker, absent admission/owner cleanup or failed registration leaves game.private_session false/unavailable. Enabled default is loopback-only and opens no socket before explicit Host/Join.",
      "buffer_contract": "`sco_result (*leave)(sco_plugin* self);`<br>Leave only the requesting owner session; no owner is an idempotent OK. Another owner cannot leave it. No output buffer.",
      "callback_context": "No plugin callback; offline/EAC inspection and transport are host-owned.",
      "cleanup": "Requesting-owner unload, explicit leave, admission loss or host stop leaves session. Stop withdraws service. Credentials are volatile backend state, not plugin-controlled persistent storage.",
      "examples": [],
      "id": "sc-private-session-v1-leave",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*leave)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*leave)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c",
            "tests/test_net_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Portable broker/provider tests use synthetic transport and forbid sockets; not native UDP or gameplay acceptance.",
        "OK Host/Join is operation acceptance, not authenticated peer connection.",
        "No C# or Lua route.",
        "Fresh local UI consent is a caller obligation; startup/settings/peer replay and automatic retries must not assert it."
      ],
      "member_extent": 32,
      "ownership": "Host owns one session and its requesting owner; request strings are borrowed for the call and copied into host storage. Plugins receive no socket/bind/allowlist authority. Caller owns copied state.",
      "purpose": "Leave only the requesting owner session; no owner is an idempotent OK. Another owner cannot leave it. No output buffer.",
      "reentrancy": "Nested calls during broker operations are refused with UNAVAILABLE.",
      "results": "OK left/already idle; BAD_ARG invalid/released self; WRONG_THREAD; UNAVAILABLE foreign owner, absent broker, runtime stopping or reentrant call.",
      "service": "game.private_session",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_private_session.h",
      "symbol": "sc_private_session_v1.leave",
      "table": "sc_private_session_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_private_session.c",
        "tests/test_net_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access.",
      "version_macro": "SC_PRIVATE_SESSION_VERSION"
    },
    {
      "absent_capability": "Disabled broker, absent admission/owner cleanup or failed registration leaves game.private_session false/unavailable. Enabled default is loopback-only and opens no socket before explicit Host/Join.",
      "buffer_contract": "`sco_result (*request_host)(sco_plugin* self, const sc_private_session_host_request_v1* request);`<br>Complete 40-byte request; consent=1 only after fresh explicit local UI Host, reserved pad zero. Passphrase 12..256 bytes, player name 1..64 bytes, no embedded NUL; nonzero port and max_peers 2..16. Strings declared UTF-8. Unknown request tail ignored. Host rechecks admission and owns numeric bind/exact peer scope.",
      "callback_context": "No plugin callback; offline/EAC inspection and transport are host-owned.",
      "cleanup": "Requesting-owner unload, explicit leave, admission loss or host stop leaves session. Stop withdraws service. Credentials are volatile backend state, not plugin-controlled persistent storage.",
      "examples": [],
      "id": "sc-private-session-v1-request-host",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*request_host)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*request_host)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c",
            "tests/test_net_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Portable broker/provider tests use synthetic transport and forbid sockets; not native UDP or gameplay acceptance.",
        "OK Host/Join is operation acceptance, not authenticated peer connection.",
        "No C# or Lua route.",
        "Fresh local UI consent is a caller obligation; startup/settings/peer replay and automatic retries must not assert it."
      ],
      "member_extent": 16,
      "ownership": "Host owns one session and its requesting owner; request strings are borrowed for the call and copied into host storage. Plugins receive no socket/bind/allowlist authority. Caller owns copied state.",
      "purpose": "Complete 40-byte request; consent=1 only after fresh explicit local UI Host, reserved pad zero. Passphrase 12..256 bytes, player name 1..64 bytes, no embedded NUL; nonzero port and max_peers 2..16. Strings declared UTF-8. Unknown request tail ignored. Host rechecks admission and owns numeric bind/exact peer scope.",
      "reentrancy": "Nested calls during broker operations are refused with UNAVAILABLE.",
      "results": "OK host operation accepted, not authenticated connection; BAD_ARG malformed/bounds/released self; FAILED absent consent or broker failure; WRONG_THREAD; UNAVAILABLE disabled/stopping/reentrant, failed admission or occupied session; TOO_MANY four-attempts-per-second host-wide limit.",
      "service": "game.private_session",
      "signature": "sco_result (*)(sco_plugin *, const sc_private_session_host_request_v1 *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_private_session.h",
      "symbol": "sc_private_session_v1.request_host",
      "table": "sc_private_session_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_private_session.c",
        "tests/test_net_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access.",
      "version_macro": "SC_PRIVATE_SESSION_VERSION"
    },
    {
      "absent_capability": "Disabled broker, absent admission/owner cleanup or failed registration leaves game.private_session false/unavailable. Enabled default is loopback-only and opens no socket before explicit Host/Join.",
      "buffer_contract": "`sco_result (*request_join)(sco_plugin* self, const sc_private_session_join_request_v1* request);`<br>Complete 48-byte request; consent=1 only after fresh explicit local UI Join, reserved pad zero. Numeric IPv4 address 1..15 bytes, passphrase 12..256 bytes, player name 1..64 bytes and nonzero port; no embedded NUL. Strings declared UTF-8. Unknown request tail ignored. Host enforces private-address allowlist and admission.",
      "callback_context": "No plugin callback; offline/EAC inspection and transport are host-owned.",
      "cleanup": "Requesting-owner unload, explicit leave, admission loss or host stop leaves session. Stop withdraws service. Credentials are volatile backend state, not plugin-controlled persistent storage.",
      "examples": [],
      "id": "sc-private-session-v1-request-join",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*request_join)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_private_session.h",
              "token": "(*request_join)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_private_session.c",
            "tests/test_net_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua game.private_session routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Portable broker/provider tests use synthetic transport and forbid sockets; not native UDP or gameplay acceptance.",
        "OK Host/Join is operation acceptance, not authenticated peer connection.",
        "No C# or Lua route.",
        "Fresh local UI consent is a caller obligation; startup/settings/peer replay and automatic retries must not assert it."
      ],
      "member_extent": 24,
      "ownership": "Host owns one session and its requesting owner; request strings are borrowed for the call and copied into host storage. Plugins receive no socket/bind/allowlist authority. Caller owns copied state.",
      "purpose": "Complete 48-byte request; consent=1 only after fresh explicit local UI Join, reserved pad zero. Numeric IPv4 address 1..15 bytes, passphrase 12..256 bytes, player name 1..64 bytes and nonzero port; no embedded NUL. Strings declared UTF-8. Unknown request tail ignored. Host enforces private-address allowlist and admission.",
      "reentrancy": "Nested calls during broker operations are refused with UNAVAILABLE.",
      "results": "OK host operation accepted, not authenticated connection; BAD_ARG malformed/bounds/released self; FAILED absent consent or broker failure; WRONG_THREAD; UNAVAILABLE disabled/stopping/reentrant, failed admission or occupied session; TOO_MANY four-attempts-per-second host-wide limit.",
      "service": "game.private_session",
      "signature": "sco_result (*)(sco_plugin *, const sc_private_session_join_request_v1 *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_private_session.h",
      "symbol": "sc_private_session_v1.request_join",
      "table": "sc_private_session_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_private_session.c",
        "tests/test_net_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access.",
      "version_macro": "SC_PRIVATE_SESSION_VERSION"
    },
    {
      "absent_capability": "Default game.quantum.control is false; mutation unavailable until a verified engine bridge exists.",
      "buffer_contract": "`sco_result (*enable)(sco_plugin* self, uint32_t on);`<br>on is 0 or 1. Claim the single controller after offline/drive admission; repeat enable by that owner is idempotent. Disable clears holding and ownership. Competing owner is refused.",
      "callback_context": "No plugin callback.",
      "cleanup": "Release cancels hold; disable/unload clears ownership; tick expires hold or cancels on lost admission. Stop withdraws and rolls back owned hooks. Uncertain bridge cleanup retains backing state/hooks and requires restart.",
      "examples": [],
      "id": "sc-quantum-v1-enable",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*enable)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*enable)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Engine bridge unavailable; not run in game.",
        "Lease expiry requires a game tick.",
        "Windows/MSVC and native detour forwarding not verified.",
        "No C# or Lua route."
      ],
      "member_extent": 16,
      "ownership": "Game pack owns one bounded controller lease and hooks; output copied to caller. No allocation or engine pointer transfer.",
      "purpose": "on is 0 or 1. Claim the single controller after offline/drive admission; repeat enable by that owner is idempotent. Disable clears holding and ownership. Competing owner is refused.",
      "reentrancy": "Recursive bridge calls refused with FAILED.",
      "results": "OK, BAD_ARG invalid/released self or bounds, WRONG_THREAD, UNAVAILABLE absent bridge/drive/offline admission/stopped session, NOT_FOUND non-owner hold/release, FAILED competing owner or restart-required fault.",
      "service": "game.quantum",
      "signature": "sco_result (*)(sco_plugin *, uint32_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_quantum.h",
      "symbol": "sc_quantum_v1.enable",
      "table": "sc_quantum_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_quantum.c",
        "tests/test_quantum.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access. No recursive calls during bridge operations.",
      "version_macro": "SC_QUANTUM_SERVICE_VERSION"
    },
    {
      "absent_capability": "Default game.quantum.control is false; mutation unavailable until a verified engine bridge exists.",
      "buffer_contract": "`sco_result (*hold)(sco_plugin* self, uint32_t milliseconds);`<br>Refresh the owned hold lease for 1..1000 milliseconds from the latest game tick. No drive or any block refuses holding. Expiry is serviced by the next game tick.",
      "callback_context": "No plugin callback.",
      "cleanup": "Release cancels hold; disable/unload clears ownership; tick expires hold or cancels on lost admission. Stop withdraws and rolls back owned hooks. Uncertain bridge cleanup retains backing state/hooks and requires restart.",
      "examples": [],
      "id": "sc-quantum-v1-hold",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*hold)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*hold)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Engine bridge unavailable; not run in game.",
        "Lease expiry requires a game tick.",
        "Windows/MSVC and native detour forwarding not verified.",
        "No C# or Lua route."
      ],
      "member_extent": 24,
      "ownership": "Game pack owns one bounded controller lease and hooks; output copied to caller. No allocation or engine pointer transfer.",
      "purpose": "Refresh the owned hold lease for 1..1000 milliseconds from the latest game tick. No drive or any block refuses holding. Expiry is serviced by the next game tick.",
      "reentrancy": "Recursive bridge calls refused with FAILED.",
      "results": "OK, BAD_ARG invalid/released self or bounds, WRONG_THREAD, UNAVAILABLE absent bridge/drive/offline admission/stopped session, NOT_FOUND non-owner hold/release, FAILED competing owner or restart-required fault.",
      "service": "game.quantum",
      "signature": "sco_result (*)(sco_plugin *, uint32_t)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_quantum.h",
      "symbol": "sc_quantum_v1.hold",
      "table": "sc_quantum_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_quantum.c",
        "tests/test_quantum.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access. No recursive calls during bridge operations.",
      "version_macro": "SC_QUANTUM_SERVICE_VERSION"
    },
    {
      "absent_capability": "Default game.quantum.control is false; mutation unavailable until a verified engine bridge exists.",
      "buffer_contract": "`sco_result (*release)(sco_plugin* self);`<br>Cancel holding while retaining enable and ownership. Repeated own release is idempotent. Unclaimed or foreign release is NOT_FOUND.",
      "callback_context": "No plugin callback.",
      "cleanup": "Release cancels hold; disable/unload clears ownership; tick expires hold or cancels on lost admission. Stop withdraws and rolls back owned hooks. Uncertain bridge cleanup retains backing state/hooks and requires restart.",
      "examples": [],
      "id": "sc-quantum-v1-release",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*release)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*release)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Engine bridge unavailable; not run in game.",
        "Lease expiry requires a game tick.",
        "Windows/MSVC and native detour forwarding not verified.",
        "No C# or Lua route."
      ],
      "member_extent": 32,
      "ownership": "Game pack owns one bounded controller lease and hooks; output copied to caller. No allocation or engine pointer transfer.",
      "purpose": "Cancel holding while retaining enable and ownership. Repeated own release is idempotent. Unclaimed or foreign release is NOT_FOUND.",
      "reentrancy": "Recursive bridge calls refused with FAILED.",
      "results": "OK, BAD_ARG invalid/released self or bounds, WRONG_THREAD, UNAVAILABLE absent bridge/drive/offline admission/stopped session, NOT_FOUND non-owner hold/release, FAILED competing owner or restart-required fault.",
      "service": "game.quantum",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_quantum.h",
      "symbol": "sc_quantum_v1.release",
      "table": "sc_quantum_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_quantum.c",
        "tests/test_quantum.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access. No recursive calls during bridge operations.",
      "version_macro": "SC_QUANTUM_SERVICE_VERSION"
    },
    {
      "absent_capability": "Default game.quantum.control is false; mutation unavailable until a verified engine bridge exists.",
      "buffer_contract": "`sco_result (*state)(sco_plugin* self, sc_quantum_state* out);`<br>Caller sets out->size to at least 32. Copy only the known prefix: enabled/held, phase, block, integer-millionth progress and opaque session generation. Unavailable observations return idle/zero and a block; early refusals leave output unchanged.",
      "callback_context": "No plugin callback.",
      "cleanup": "Release cancels hold; disable/unload clears ownership; tick expires hold or cancels on lost admission. Stop withdraws and rolls back owned hooks. Uncertain bridge cleanup retains backing state/hooks and requires restart.",
      "examples": [],
      "id": "sc-quantum-v1-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_quantum.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_quantum.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/quantum.md",
              "token": "C# and Lua quantum routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Engine bridge unavailable; not run in game.",
        "Lease expiry requires a game tick.",
        "Windows/MSVC and native detour forwarding not verified.",
        "No C# or Lua route."
      ],
      "member_extent": 40,
      "ownership": "Game pack owns one bounded controller lease and hooks; output copied to caller. No allocation or engine pointer transfer.",
      "purpose": "Caller sets out->size to at least 32. Copy only the known prefix: enabled/held, phase, block, integer-millionth progress and opaque session generation. Unavailable observations return idle/zero and a block; early refusals leave output unchanged.",
      "reentrancy": "Recursive bridge calls refused with FAILED.",
      "results": "OK, BAD_ARG invalid/released self or bounds, WRONG_THREAD, UNAVAILABLE absent bridge/drive/offline admission/stopped session, NOT_FOUND non-owner hold/release, FAILED competing owner or restart-required fault.",
      "service": "game.quantum",
      "signature": "sco_result (*)(sco_plugin *, sc_quantum_state *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_quantum.h",
      "symbol": "sc_quantum_v1.state",
      "table": "sc_quantum_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_quantum.c",
        "tests/test_quantum.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD before state access. No recursive calls during bridge operations.",
      "version_macro": "SC_QUANTUM_SERVICE_VERSION"
    },
    {
      "absent_capability": "Missing service: query_service NOT_FOUND. Production table is present but game.relocation capability false; valid request returns SCO_UNAVAILABLE.",
      "buffer_contract": "`sco_result (*cancel)(sco_plugin* self, uint64_t ticket);`<br>Owner-only idempotent cancellation of a known ticket. Does not undo movement already initiated. Foreign or evicted tickets are NOT_FOUND. Zero ticket is BAD_ARG.",
      "callback_context": "No callbacks; bounded tick-driven work.",
      "cleanup": "Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo.",
      "examples": [],
      "id": "sc-relocation-v1-cancel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*cancel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*cancel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c",
            "tests/test_relocation.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production relocation unavailable until grounded host safety/session admission, certified system classification and validated transport exist.",
        "Synthetic shared-logic and fake-provider fixtures only; Windows/MSVC, game provider and gameplay not verified."
      ],
      "member_extent": 24,
      "ownership": "Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission.",
      "purpose": "Owner-only idempotent cancellation of a known ticket. Does not undo movement already initiated. Foreign or evicted tickets are NOT_FOUND. Zero ticket is BAD_ARG.",
      "reentrancy": "Non-reentrant.",
      "results": "SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure.",
      "service": "game.relocation",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_relocation.h",
      "symbol": "sc_relocation_v1.cancel",
      "table": "sc_relocation_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_relocation.c",
        "tests/test_relocation.cpp"
      ],
      "thread_affinity": "Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state.",
      "version_macro": "SC_RELOCATION_VERSION"
    },
    {
      "absent_capability": "Missing service: query_service NOT_FOUND. Production table is present but game.relocation capability false; valid request returns SCO_UNAVAILABLE.",
      "buffer_contract": "`sco_result (*request)(sco_plugin* self, const sc_relocation_request* request, uint64_t* out_ticket);`<br>Admit a copied finite bounded position and normalized quaternion for a streamed nonzero target zone. Request size at least 72, timeout 1..60000ms. Requires known equal nonzero systems, host-certified offline/session/player and validated transport. Unknown safety or system refuses. One global pending request. Output ticket unchanged on refusal; admission is not completion.",
      "callback_context": "No callbacks; bounded tick-driven work.",
      "cleanup": "Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo.",
      "examples": [],
      "id": "sc-relocation-v1-request",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*request)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c",
            "tests/test_relocation.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production relocation unavailable until grounded host safety/session admission, certified system classification and validated transport exist.",
        "Synthetic shared-logic and fake-provider fixtures only; Windows/MSVC, game provider and gameplay not verified."
      ],
      "member_extent": 16,
      "ownership": "Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission.",
      "purpose": "Admit a copied finite bounded position and normalized quaternion for a streamed nonzero target zone. Request size at least 72, timeout 1..60000ms. Requires known equal nonzero systems, host-certified offline/session/player and validated transport. Unknown safety or system refuses. One global pending request. Output ticket unchanged on refusal; admission is not completion.",
      "reentrancy": "Non-reentrant.",
      "results": "SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure.",
      "service": "game.relocation",
      "signature": "sco_result (*)(sco_plugin *, const sc_relocation_request *, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_relocation.h",
      "symbol": "sc_relocation_v1.request",
      "table": "sc_relocation_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_relocation.c",
        "tests/test_relocation.cpp"
      ],
      "thread_affinity": "Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state.",
      "version_macro": "SC_RELOCATION_VERSION"
    },
    {
      "absent_capability": "Missing service: query_service NOT_FOUND. Production table is present but game.relocation capability false; valid request returns SCO_UNAVAILABLE.",
      "buffer_contract": "`sco_result (*status)(sco_plugin* self, uint64_t ticket, sc_relocation_status* out);`<br>Owner-only copied status; caller size at least 24. Preserve caller size and unknown tail. Pending, complete, cancelled or failed plus bounded reason and applied flag. Status does not advance work. Foreign or evicted ticket NOT_FOUND; output unchanged on failure.",
      "callback_context": "No callbacks; bounded tick-driven work.",
      "cleanup": "Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo.",
      "examples": [],
      "id": "sc-relocation-v1-status",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*status)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "(*status)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_relocation.c",
            "tests/test_relocation.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "include/sc_relocation.h",
              "token": "C# and Lua unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Production relocation unavailable until grounded host safety/session admission, certified system classification and validated transport exist.",
        "Synthetic shared-logic and fake-provider fixtures only; Windows/MSVC, game provider and gameplay not verified."
      ],
      "member_extent": 32,
      "ownership": "Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission.",
      "purpose": "Owner-only copied status; caller size at least 24. Preserve caller size and unknown tail. Pending, complete, cancelled or failed plus bounded reason and applied flag. Status does not advance work. Foreign or evicted ticket NOT_FOUND; output unchanged on failure.",
      "reentrancy": "Non-reentrant.",
      "results": "SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure.",
      "service": "game.relocation",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, sc_relocation_status *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_relocation.h",
      "symbol": "sc_relocation_v1.status",
      "table": "sc_relocation_v1",
      "table_size": 32,
      "tests": [
        "tests/abi_relocation.c",
        "tests/test_relocation.cpp"
      ],
      "thread_affinity": "Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state.",
      "version_macro": "SC_RELOCATION_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.reputation.checks OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*checks)(sco_plugin* self, sc_reputation_checks* out);`<br>Fills *out (sc_reputation_checks) from the game's reputation-service check sites and the services object they load. Reads only; nothing is called or written in the game. SCO_BAD_ARG: out NULL or out->size smaller than sizeof(sc_reputation_checks). SCO_FAILED: the game faulted. game.reputation.checks.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; checks only reads and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-reputation-v1-checks",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_reputation.h",
              "token": "(*checks)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_reputation.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/reputation.hpp",
              "token": "return t_->checks(self_, &out);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Reputation.cs",
              "token": "_t->checks(Self, &c);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.reputation routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "Fills *out (sc_reputation_checks) from the game's reputation-service check sites and the services object they load. Reads only; nothing is called or written in the game. SCO_BAD_ARG: out NULL or out->size smaller than sizeof(sc_reputation_checks). SCO_FAILED: the game faulted. game.reputation.checks.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; game.reputation.checks OFF (the default): UNAVAILABLE without an engine read; null/unknown self: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.reputation",
      "signature": "sco_result (*)(sco_plugin *, sc_reputation_checks *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_reputation.h",
      "symbol": "sc_reputation_v1.checks",
      "table": "sc_reputation_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_reputation.c",
        "tests/test_reputation.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_REPUTATION_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; checks only reads and nothing is undone at unload; your last error is forgotten on ordinary owner release.",
      "examples": [],
      "id": "sc-reputation-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_reputation.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_reputation.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/reputation.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Reputation.cs",
              "token": "return Storage.Sized((buf, size) => ((ScReputationV1*)t)->last_error((void*)self, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "Lua game.reputation routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Capabilities OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; nothing owned, the host keeps only your last error. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: your own last failed call; on another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. On the game thread with a loaded self: your own last error; otherwise the thread's last refusal.",
      "service": "game.reputation",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_reputation.h",
      "symbol": "sc_reputation_v1.last_error",
      "table": "sc_reputation_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_game_reputation.c",
        "tests/test_reputation.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_REPUTATION_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*local_to_world)(uint64_t zone_id, const double local[3], double world[3]);`<br>A position in zone zone_id to the world frame, and back.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-local-to-world",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*local_to_world)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*local_to_world)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "A position in zone zone_id to the world frame, and back.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(uint64_t, const double *, double *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.local_to_world",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*player_pose)(double pos[3], double rot_xyzw[4], uint64_t* zone_id);`<br>Your position (pos, metres) and orientation (rot, a unit quaternion in the game's (x, y, z, w) order) in the zone you're in, and that zone's id.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-player-pose",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*player_pose)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*player_pose)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "Your position (pos, metres) and orientation (rot, a unit quaternion in the game's (x, y, z, w) order) in the zone you're in, and that zone's id.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(double *, double *, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.player_pose",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*world_to_local)(uint64_t zone_id, const double world[3], double local[3]);`<br>Converts world[3] doubles to zone-local local[3] doubles; zone 0 is world; outputs written only on return 1.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-world-to-local",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*world_to_local)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*world_to_local)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "Converts world[3] doubles to zone-local local[3] doubles; zone 0 is world; outputs written only on return 1.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(uint64_t, const double *, double *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.world_to_local",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*zone_name)(uint64_t zone_id, char* out, uint32_t cap);`<br>The zone's name (\"OOC_Stanton_2b_Daymar\"), NUL-terminated and cut to fit cap bytes.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-zone-name",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_name)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_name)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "The zone's name (\"OOC_Stanton_2b_Daymar\"), NUL-terminated and cut to fit cap bytes.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(uint64_t, char *, uint32_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.zone_name",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*zone_of_entity)(uint64_t entity_id, uint64_t* zone_id);`<br>The id of the zone an entity is in (your ship's, a spawned entity's).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-zone-of-entity",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_of_entity)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_of_entity)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "The id of the zone an entity is in (your ship's, a spawned entity's).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(uint64_t, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.zone_of_entity",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`int (*zone_to_zone)(uint64_t from, uint64_t to, const double in[3], double out[3]);`<br>A position in zone `from` to zone `to` (either may be 0, the world).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-spatial-v1-zone-to-zone",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_to_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spatial.h",
              "token": "(*zone_to_zone)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spatial.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "Caller buffers; IDs are borrowed session values, not pointers. No allocation transfer; internal allocation unspecified.",
      "purpose": "A position in zone `from` to zone `to` (either may be 0, the world).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; wrong thread/missing teleport or unreadable game state: 0. Outputs only written on 1. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "teleport.spatial",
      "signature": "int (*)(uint64_t, uint64_t, const double *, double *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_spatial.h",
      "symbol": "sc_spatial_v1.zone_to_zone",
      "table": "sc_spatial_v1",
      "table_size": 56,
      "tests": [
        "tests/abi_spatial.c"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`int (*class_exists)(const char* entity_class);`<br>1 if entity_class is a spawnable class on this game build, else 0.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-class-exists",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*class_exists)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*class_exists)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "IDs are session values, not pointers; caller outputs. No allocation transfer; internal allocation unspecified.",
      "purpose": "1 if entity_class is a spawnable class on this game build, else 0.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "int (*)(const char *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.class_exists",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`int (*entity_alive)(uint64_t entity_id);`<br>1.1. 1 while the entity id resolves in the game (spawned and streamed in), else 0; 0 for id 0. Asked afresh on every call. A 1.0 table ends before this field: call it only when size &gt; offsetof(sc_spawn_service_v1, entity_alive).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-entity-alive",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*entity_alive)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*entity_alive)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "IDs are session values, not pointers; caller outputs. No allocation transfer; internal allocation unspecified.",
      "purpose": "1.1. 1 while the entity id resolves in the game (spawned and streamed in), else 0; 0 for id 0. Asked afresh on every call. A 1.0 table ends before this field: call it only when size &gt; offsetof(sc_spawn_service_v1, entity_alive).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "int (*)(uint64_t)",
      "since": "`size >= 48`; 1.1",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.entity_alive",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`uint64_t (*local_player_id)(void);`<br>Your entity id, or 0 before you've spawned.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-local-player-id",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*local_player_id)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*local_player_id)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "IDs are session values, not pointers; caller outputs. No allocation transfer; internal allocation unspecified.",
      "purpose": "Your entity id, or 0 before you've spawned.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "uint64_t (*)(void)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.local_player_id",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`uint64_t (*player_ship_id)(void);`<br>The ship you're aboard, or 0.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-player-ship-id",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*player_ship_id)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*player_ship_id)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "IDs are session values, not pointers; caller outputs. No allocation transfer; internal allocation unspecified.",
      "purpose": "The ship you're aboard, or 0.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "uint64_t (*)(void)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.player_ship_id",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`int (*set_entity_transform)(sco_plugin* self, uint64_t entity_id, uint64_t zone_id, const double pos[3], const double rot[4]);`<br>1.2. Moves and turns an entity: pos (metres) and rot (a unit quaternion, x y z w, the order of sc_spatial.h's player_pose) in zone zone_id's frame. zone_id 0 is the world (root) frame; any other id is that zone's local frame (ids from teleport.spatial: player_pose, zone_of_entity). The entity stays in the zone it's in; the pose is converted to that zone's frame. 1 on success, 0 on failure: wrong thread, a null pointer, rot not finite or of zero length (it is normalized), an id that isn't streamed in, a zone the game pack can't place, or an entity you may not move; the game pack logs the reason (\"[game] warning: set_entity_transform(&lt;id&gt;) -&gt; 0: &lt;reason&gt;\") once per id and reason. A fresh spawn takes seconds to stream in and answers 0 until then: check entity_alive(id) first, and try again on a later tick while it answers 0. You may move: - an entity spawned through spawn_as with your own self, while your plugin is loaded (unloading forgets them; spawn_near_player and the spawn.ship command count for nobody); - your player's own vehicle once the product has registered it as retrieved or delivered by ATC (sco::game::services::RegisterPlayerVehicle; registration depends on the product). self is your plugin's handle, as sco_plugin_load received it. A 1.1 table ends before this field: call it only when the table is non-null, size &gt;= offsetof(sc_spawn_service_v1, set_entity_transform) + sizeof(table-&gt;set_entity_transform), and table-&gt;set_entity_transform is non-null.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-set-entity-transform",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*set_entity_transform)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*set_entity_transform)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "May move only own spawn_as entities or player vehicles registered by product; input arrays borrowed during call; no allocation transfer.",
      "purpose": "1.2. Moves and turns an entity: pos (metres) and rot (a unit quaternion, x y z w, the order of sc_spatial.h's player_pose) in zone zone_id's frame. zone_id 0 is the world (root) frame; any other id is that zone's local frame (ids from teleport.spatial: player_pose, zone_of_entity). The entity stays in the zone it's in; the pose is converted to that zone's frame. 1 on success, 0 on failure: wrong thread, a null pointer, rot not finite or of zero length (it is normalized), an id that isn't streamed in, a zone the game pack can't place, or an entity you may not move; the game pack logs the reason (\"[game] warning: set_entity_transform(&lt;id&gt;) -&gt; 0: &lt;reason&gt;\") once per id and reason. A fresh spawn takes seconds to stream in and answers 0 until then: check entity_alive(id) first, and try again on a later tick while it answers 0. You may move: - an entity spawned through spawn_as with your own self, while your plugin is loaded (unloading forgets them; spawn_near_player and the spawn.ship command count for nobody); - your player's own vehicle once the product has registered it as retrieved or delivered by ATC (sco::game::services::RegisterPlayerVehicle; registration depends on the product). self is your plugin's handle, as sco_plugin_load received it. A 1.1 table ends before this field: call it only when the table is non-null, size &gt;= offsetof(sc_spawn_service_v1, set_entity_transform) + sizeof(table-&gt;set_entity_transform), and table-&gt;set_entity_transform is non-null.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "int (*)(sco_plugin *, uint64_t, uint64_t, const double *, const double *)",
      "since": "`size >= 56`; 1.2",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.set_entity_transform",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`const char* (*spawn_as)(sco_plugin* self, const char* entity_class, const double offset[3], uint64_t* out_id);`<br>1.2. spawn_near_player, recorded as yours (self, as sco_plugin_load received it), so set_entity_transform lets you move the entity. Same answers as spawn_near_player, plus \"bad argument\" for a null self. Same size check as set_entity_transform: size &gt; offsetof(sc_spawn_service_v1, spawn_as). Implementation may return tracking-failure reason after successful spawn with out_id nonzero.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-spawn-as",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*spawn_as)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*spawn_as)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "lifetime unspecified;",
        "recursive reentrancy unspecified.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 64,
      "ownership": "Movement ownership recorded for self, forgotten on unload; this is not an automatic despawn promise. Failure reason borrowed; lifetime unspecified; never free.",
      "purpose": "1.2. spawn_near_player, recorded as yours (self, as sco_plugin_load received it), so set_entity_transform lets you move the entity. Same answers as spawn_near_player, plus \"bad argument\" for a null self. Same size check as set_entity_transform: size &gt; offsetof(sc_spawn_service_v1, spawn_as). Implementation may return tracking-failure reason after successful spawn with out_id nonzero.",
      "reentrancy": "unspecified",
      "results": "NULL means spawn and tracking succeeded; non-NULL borrowed reason otherwise. Tracking failure can occur after spawn, with nonzero out ID and live unowned/unmovable entity; failure is not rollback.",
      "service": "spawn.entities",
      "signature": "const char *(*)(sco_plugin *, const char *, const double *, uint64_t *)",
      "since": "`size >= 64`; 1.2",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.spawn_as",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND Wrong thread or missing readiness: 0 or borrowed reason string.",
      "buffer_contract": "`const char* (*spawn_near_player)(const char* entity_class, const double offset[3], uint64_t* out_id);`<br>Spawns an entity class (a ship, a vehicle, an item) at offset metres from you, in your current zone's frame. NULL on success with *out_id = the new entity id; else the reason. The id is final at once, but the entity streams in later: a few seconds, up to a minute for a big ship. entity_alive(id) answers 1 once it has. An entity spawned here belongs to no plugin: set_entity_transform refuses it. Use spawn_as for an entity you will move. Implementation initializes out_id to 0 before failure checks.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; asynchronous streaming is not cancelled by this table.",
      "examples": [],
      "id": "sc-spawn-service-v1-spawn-near-player",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*spawn_near_player)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sc_spawn.h",
              "token": "(*spawn_near_player)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_spawn.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "The host-owned services each have a class."
            },
            {
              "path": "docs/sdk-csharp.md",
              "token": "| Class | Service | Does |"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (!(actors || vehicles || world || entities || creative)) return;"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "returned string lifetime unspecified;",
        "recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Spawned entity belongs to no plugin; out ID caller-owned. Failure reason is borrowed; returned string lifetime unspecified; never free.",
      "purpose": "Spawns an entity class (a ship, a vehicle, an item) at offset metres from you, in your current zone's frame. NULL on success with *out_id = the new entity id; else the reason. The id is final at once, but the entity streams in later: a few seconds, up to a minute for a big ship. entity_alive(id) answers 1 once it has. An entity spawned here belongs to no plugin: set_entity_transform refuses it. Use spawn_as for an entity you will move. Implementation initializes out_id to 0 before failure checks.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; requires spawner rows (product gate spawn.ship). Wrong thread or missing readiness: 0 or borrowed reason string. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "spawn.entities",
      "signature": "const char *(*)(const char *, const double *, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_spawn.h",
      "symbol": "sc_spawn_service_v1.spawn_near_player",
      "table": "sc_spawn_service_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_spawn.c",
        "tests/test_app.cpp"
      ],
      "thread_affinity": "Game thread only; recursive reentrancy unspecified.",
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*eject)(sco_plugin* self, uint64_t actor);`<br>Takes actor out of the seat it's in (same rule on whose actor as seat()). SCO_FAILED when it isn't seated. game.vehicles.seat.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-eject",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*eject)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "sco_result Eject(uint64_t actor) const noexcept { return detail::CanCall(ref_.Get(), &sc_vehicles_v1::eject) ? ref_->eject(self_, actor) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "public ScoResult Eject(ulong actor) => _t == null || _t->size < (uint)((byte*)&_t->eject - (byte*)_t + sizeof(nint)) || _t->eject == null ? ScoResult.Unavailable : _t->eject(Self, actor);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can list seats but can't seat, eject or power on"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 48,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "Takes actor out of the seat it's in (same rule on whose actor as seat()). SCO_FAILED when it isn't seated. game.vehicles.seat.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.eject",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: the newer of your own last failed call (functions with self) and the last failed query (functions without self, by any plugin); ask right after the call. On another thread: the last refusal on that thread. Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "return ref_->last_error(self_, out.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "return Storage.Sized((buf, size) => _t->last_error(Self, buf, size), out byte[] b) == ScoResult.Ok ? Utf8.FromBytes(b) : \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (GAME_MEMBER(v, sc_vehicles_v1, last_error) && v->last_error(self, msg, &size) == SCO_OK && msg[0]) { lua_pushstring(L, msg); return 3; }"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "self validity and stopped-service rejection unspecified;",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 64,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "The reason for the last failed call (\"\" if none), NUL-terminated, with sco.storage's size handshake: *inout_size is out's capacity on entry and the bytes written (NUL included) on SCO_OK, or the bytes needed on SCO_TOO_MANY. out may be NULL when *inout_size is 0. On the game thread: the newer of your own last failed call (functions with self) and the last failed query (functions without self, by any plugin); ask right after the call. On another thread: the last refusal on that thread. Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid buffer; TOO_MANY required bytes. Game thread selects newer own/shared-query error; other threads their refusal. self validity and stopped-service rejection unspecified; implementation does not enforce them.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.last_error",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*player_ship)(uint64_t* out_ship);`<br>The ship you're aboard (standing or seated in it). SCO_OK and the id; SCO_NOT_FOUND when you're in no ship; SCO_UNAVAILABLE before you've spawned or without the capability. game.vehicles.seats.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-player-ship",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*player_ship)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "return detail::CanCall(ref_.Get(), &sc_vehicles_v1::player_ship) ? ref_->player_ship(&ship) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "ScoResult r = _t == null || _t->size < (uint)((byte*)&_t->player_ship - (byte*)_t + sizeof(nint)) || _t->player_ship == null ? ScoResult.Unavailable : _t->player_ship(&id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(v, sc_vehicles_v1, player_ship) ? v->player_ship(&ship) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "The ship you're aboard (standing or seated in it). SCO_OK and the id; SCO_NOT_FOUND when you're in no ship; SCO_UNAVAILABLE before you've spawned or without the capability. game.vehicles.seats.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.player_ship",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*power_on)(sco_plugin* self, uint64_t ship);`<br>Sends the game's Flight Ready event to ship's pilot dashboard, as pressing R in the pilot seat does. You may power on the ship you're aboard, your player's own registered vehicles and ships your plugin spawned through spawn_as; anything else is SCO_BAD_ARG. SCO_FAILED while the ship has no dashboard streamed in yet (a big ship takes up to 20 s): try again on a later tick. game.vehicles.flight_ready.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-power-on",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*power_on)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "sco_result PowerOn(uint64_t ship) const noexcept { return detail::CanCall(ref_.Get(), &sc_vehicles_v1::power_on) ? ref_->power_on(self_, ship) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "public ScoResult PowerOn(ulong ship) => _t == null || _t->size < (uint)((byte*)&_t->power_on - (byte*)_t + sizeof(nint)) || _t->power_on == null ? ScoResult.Unavailable : _t->power_on(Self, ship);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can list seats but can't seat, eject or power on"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 56,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "Sends the game's Flight Ready event to ship's pilot dashboard, as pressing R in the pilot seat does. You may power on the ship you're aboard, your player's own registered vehicles and ships your plugin spawned through spawn_as; anything else is SCO_BAD_ARG. SCO_FAILED while the ship has no dashboard streamed in yet (a big ship takes up to 20 s): try again on a later tick. game.vehicles.flight_ready.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.power_on",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*seat)(sco_plugin* self, uint64_t actor, uint64_t ship, uint32_t seat_index);`<br>Puts actor into seat seat_index of ship, moving it out of any seat it's in first. You may seat your player's own actor, or an actor your plugin spawned through spawn.entities' spawn_as or game.actors' spawn_npc (while your plugin is loaded); anything else is SCO_BAD_ARG. SCO_FAILED: the seat isn't usable (no SC_SEAT_USABLE), someone else is in it (nobody is evicted), the actor isn't streamed in yet or has no seat link, or the game faulted. SCO_OK means the game accepted the link; it takes effect within a second or two: check seat_occupant() on a later tick, and call seat() again if it didn't take. game.vehicles.seat.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-seat",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*seat)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "return detail::CanCall(ref_.Get(), &sc_vehicles_v1::seat) ? ref_->seat(self_, actor, ship, seatIndex) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "public ScoResult Seat(ulong actor, ulong ship, uint seatIndex) => _t == null || _t->size < (uint)((byte*)&_t->seat - (byte*)_t + sizeof(nint)) || _t->seat == null ? ScoResult.Unavailable : _t->seat(Self, actor, ship, seatIndex);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "Read-only: scripts can list seats but can't seat, eject or power on"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "Puts actor into seat seat_index of ship, moving it out of any seat it's in first. You may seat your player's own actor, or an actor your plugin spawned through spawn.entities' spawn_as or game.actors' spawn_npc (while your plugin is loaded); anything else is SCO_BAD_ARG. SCO_FAILED: the seat isn't usable (no SC_SEAT_USABLE), someone else is in it (nobody is evicted), the actor isn't streamed in yet or has no seat link, or the game faulted. SCO_OK means the game accepted the link; it takes effect within a second or two: check seat_occupant() on a later tick, and call seat() again if it didn't take. game.vehicles.seat.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, uint32_t)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.seat",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*seat_occupant)(uint64_t ship, uint32_t seat_index, uint64_t* out_actor);`<br>out_actor = the actor in seat seat_index of ship, or 0 when the seat is empty. SCO_FAILED when the seat is occupied but the game pack can't tell by whom (last_error has the raw field); SCO_NOT_FOUND for a ship that isn't streamed in or an index past the last seat. game.vehicles.seats.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-seat-occupant",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*seat_occupant)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "return detail::CanCall(ref_.Get(), &sc_vehicles_v1::seat_occupant) ? ref_->seat_occupant(ship, seatIndex, &actor) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "ScoResult r = _t == null || _t->size < (uint)((byte*)&_t->seat_occupant - (byte*)_t + sizeof(nint)) || _t->seat_occupant == null ? ScoResult.Unavailable : _t->seat_occupant(ship, seatIndex, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(v, sc_vehicles_v1, seat_occupant) ? v->seat_occupant(ship, (uint32_t)index, &actor) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "out_actor = the actor in seat seat_index of ship, or 0 when the seat is empty. SCO_FAILED when the seat is occupied but the game pack can't tell by whom (last_error has the raw field); SCO_NOT_FOUND for a ship that isn't streamed in or an index past the last seat. game.vehicles.seats.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(uint64_t, uint32_t, uint64_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.seat_occupant",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*seats)(uint64_t ship, sc_vehicle_seat* out, uint32_t max, uint32_t* out_count, uint32_t* out_more);`<br>Fills out[0..max) with ship's seats in the game's order and sets *out_count to how many were written and *out_more to 1 when the ship has more than that (else 0). out may be NULL when max is 0 (then *out_more says whether the ship has any). SCO_NOT_FOUND: ship isn't streamed in or isn't a vehicle. game.vehicles.seats.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation entrypoint; game acceptance need not mean action completed.",
      "examples": [],
      "id": "sc-vehicles-v1-seats",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_vehicles.h",
              "token": "(*seats)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_vehicles.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/vehicles.hpp",
              "token": "const sco_result r = ref_->seats(ship, out.data(), static_cast<uint32_t>(out.size()), &count, &m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_vehicles.c",
            "tests/test_app.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/Vehicles.cs",
              "token": "fixed (ScVehicleSeat* p = seats) r = _t->seats(ship, p, (uint)seats.Length, &n, &m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(v, sc_vehicles_v1, seats) ? v->seats(ship, g_vehSeats, (uint32_t)(sizeof(g_vehSeats) / sizeof(g_vehSeats[0])), &n, &more)"
            },
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "static sc_vehicle_seat g_vehSeats[256];"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "released-handle refusal unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; IDs/seat indexes are streaming-session values. No allocation transfer; internal allocation unspecified.",
      "purpose": "Fills out[0..max) with ship's seats in the game's order and sets *out_count to how many were written and *out_more to 1 when the ship has more than that (else 0). out may be NULL when max is 0 (then *out_more says whether the ship has any). SCO_NOT_FOUND: ship isn't streamed in or isn't a vehicle. game.vehicles.seats.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; self validity as checked by implementation; released-handle refusal unspecified. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.vehicles",
      "signature": "sco_result (*)(uint64_t, sc_vehicle_seat *, uint32_t, uint32_t *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_vehicles.h",
      "symbol": "sc_vehicles_v1.seats",
      "table": "sc_vehicles_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_game_vehicles.c",
        "tests/test_app.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    {
      "absent_capability": "Absent service: query_service NOT_FOUND; present disabled operation: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*camera_acquire)(sco_plugin* self, uint64_t* out_lease);`<br>Exclusive owner-scoped camera lease; output token zero on failure. Same owner reacquire returns same token; foreign owner FAILED. Provider captures all camera/input/mode state before mutation; acquire failure atomic. UNAVAILABLE without complete verified offline adapter and cleanup hook. Capability game.world.free_camera remains OFF.",
      "callback_context": "No plugin callbacks. Host-only provider callbacks synchronous, bounded, nonthrowing.",
      "cleanup": "No persisted ray filter. Ordinary owner unload/service stop restores camera before dropping lease; failure retains backing state and requires restart. Fault-retained native provider cleanup not promised.",
      "examples": [],
      "id": "sc-world-control-v1-camera-acquire",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world_control.h",
              "token": "(*camera_acquire)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_world_control.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world_control.hpp",
              "token": "t_->camera_acquire("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_world_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic provider verification only; Windows engine integration/gameplay not verified.",
        "Production adapter deliberately absent; mutation/read-filter capabilities OFF.",
        "Per-call bounds are not a native-plugin security sandbox."
      ],
      "member_extent": 24,
      "ownership": "Live owner required; call-only copied inputs, host-session borrowed table. No allocation or engine pointers cross boundary. Camera lease exclusive; no steal.",
      "purpose": "Exclusive owner-scoped camera lease; output token zero on failure. Same owner reacquire returns same token; foreign owner FAILED. Provider captures all camera/input/mode state before mutation; acquire failure atomic. UNAVAILABLE without complete verified offline adapter and cleanup hook. Capability game.world.free_camera remains OFF.",
      "reentrancy": "Recursive calls refused with FAILED; no waits or async work.",
      "results": "BAD_ARG invalid owner/input; WRONG_THREAD; UNAVAILABLE absent verified adapter or restart-required; FAILED foreign owner/provider refusal; NOT_FOUND stale lease/no hit. See method-specific output contract.",
      "service": "game.world.control",
      "signature": "sco_result (*)(sco_plugin *, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_world_control.h",
      "symbol": "sc_world_control_v1.camera_acquire",
      "table": "sc_world_control_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_world_control.c",
        "tests/test_world_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD without provider access.",
      "version_macro": "SC_WORLD_CONTROL_VERSION_1_0"
    },
    {
      "absent_capability": "Absent service: query_service NOT_FOUND; present disabled operation: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*camera_release)(sco_plugin* self, uint64_t lease);`<br>Restore exact pre-acquire shared camera/input/mode state before relinquishing own lease. Foreign owner FAILED; stale/zero token NOT_FOUND. Restore failure FAILED retains provider state and latches restart-required; owner cleanup/release can retry restoration, never re-enable mutations. Recovery release allowed after service stop.",
      "callback_context": "No plugin callbacks. Host-only provider callbacks synchronous, bounded, nonthrowing.",
      "cleanup": "No persisted ray filter. Ordinary owner unload/service stop restores camera before dropping lease; failure retains backing state and requires restart. Fault-retained native provider cleanup not promised.",
      "examples": [],
      "id": "sc-world-control-v1-camera-release",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world_control.h",
              "token": "(*camera_release)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_world_control.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world_control.hpp",
              "token": "t_->camera_release("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_world_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic provider verification only; Windows engine integration/gameplay not verified.",
        "Production adapter deliberately absent; mutation/read-filter capabilities OFF.",
        "Per-call bounds are not a native-plugin security sandbox."
      ],
      "member_extent": 40,
      "ownership": "Live owner required; call-only copied inputs, host-session borrowed table. No allocation or engine pointers cross boundary. Camera lease exclusive; no steal.",
      "purpose": "Restore exact pre-acquire shared camera/input/mode state before relinquishing own lease. Foreign owner FAILED; stale/zero token NOT_FOUND. Restore failure FAILED retains provider state and latches restart-required; owner cleanup/release can retry restoration, never re-enable mutations. Recovery release allowed after service stop.",
      "reentrancy": "Recursive calls refused with FAILED; no waits or async work.",
      "results": "BAD_ARG invalid owner/input; WRONG_THREAD; UNAVAILABLE absent verified adapter or restart-required; FAILED foreign owner/provider refusal; NOT_FOUND stale lease/no hit. See method-specific output contract.",
      "service": "game.world.control",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sc_world_control.h",
      "symbol": "sc_world_control_v1.camera_release",
      "table": "sc_world_control_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_world_control.c",
        "tests/test_world_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD without provider access.",
      "version_macro": "SC_WORLD_CONTROL_VERSION_1_0"
    },
    {
      "absent_capability": "Absent service: query_service NOT_FOUND; present disabled operation: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*camera_step)(sco_plugin* self, uint64_t lease, const sc_world_camera_step* step);`<br>Only own active lease; copied size-prefixed step, tail ignored, reserved pad zero. Finite world translation norm <=10m and unit quaternion shortest world rotation delta <=0.25rad per call. No absolute pose or FOV. BAD_ARG invalid delta, NOT_FOUND stale/zero token, FAILED foreign owner. Provider failure attempts restoration and permanently latches restart-required.",
      "callback_context": "No plugin callbacks. Host-only provider callbacks synchronous, bounded, nonthrowing.",
      "cleanup": "No persisted ray filter. Ordinary owner unload/service stop restores camera before dropping lease; failure retains backing state and requires restart. Fault-retained native provider cleanup not promised.",
      "examples": [],
      "id": "sc-world-control-v1-camera-step",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world_control.h",
              "token": "(*camera_step)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_world_control.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world_control.hpp",
              "token": "t_->camera_step("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_world_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic provider verification only; Windows engine integration/gameplay not verified.",
        "Production adapter deliberately absent; mutation/read-filter capabilities OFF.",
        "Per-call bounds are not a native-plugin security sandbox."
      ],
      "member_extent": 32,
      "ownership": "Live owner required; call-only copied inputs, host-session borrowed table. No allocation or engine pointers cross boundary. Camera lease exclusive; no steal.",
      "purpose": "Only own active lease; copied size-prefixed step, tail ignored, reserved pad zero. Finite world translation norm <=10m and unit quaternion shortest world rotation delta <=0.25rad per call. No absolute pose or FOV. BAD_ARG invalid delta, NOT_FOUND stale/zero token, FAILED foreign owner. Provider failure attempts restoration and permanently latches restart-required.",
      "reentrancy": "Recursive calls refused with FAILED; no waits or async work.",
      "results": "BAD_ARG invalid owner/input; WRONG_THREAD; UNAVAILABLE absent verified adapter or restart-required; FAILED foreign owner/provider refusal; NOT_FOUND stale lease/no hit. See method-specific output contract.",
      "service": "game.world.control",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, const sc_world_camera_step *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_world_control.h",
      "symbol": "sc_world_control_v1.camera_step",
      "table": "sc_world_control_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_world_control.c",
        "tests/test_world_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD without provider access.",
      "version_macro": "SC_WORLD_CONTROL_VERSION_1_0"
    },
    {
      "absent_capability": "Absent service: query_service NOT_FOUND; present disabled operation: UNAVAILABLE.",
      "buffer_contract": "`sco_result (*raycast_filtered)(sco_plugin* self, uint64_t zone_id, const double from[3], const double dir[3], double max_dist, const uint64_t* skip_ids, uint32_t skip_count, sc_world_hit* out_hit);`<br>Zone-local ray; direction normalized, positive finite distance clamped to 20000m. At most 32 unique nonzero current own IDs, copied for call only; foreign/relinquished ID FAILED, malformed input BAD_ARG. Adequately-sized hit zeroed on failure, unknown tail untouched; success position/distance only, entity/normal/flags zero. NULL/short hit rejected before zeroing. Capability game.world.raycast_filtered remains OFF.",
      "callback_context": "No plugin callbacks. Host-only provider callbacks synchronous, bounded, nonthrowing.",
      "cleanup": "No persisted ray filter. Ordinary owner unload/service stop restores camera before dropping lease; failure retains backing state and requires restart. Fault-retained native provider cleanup not promised.",
      "examples": [],
      "id": "sc-world-control-v1-raycast-filtered",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world_control.h",
              "token": "(*raycast_filtered)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_world_control.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world_control.hpp",
              "token": "t_->raycast_filtered("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_world_control.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/world-control.md",
              "token": "C# and sandboxed Lua: unsupported"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Synthetic provider verification only; Windows engine integration/gameplay not verified.",
        "Production adapter deliberately absent; mutation/read-filter capabilities OFF.",
        "Per-call bounds are not a native-plugin security sandbox."
      ],
      "member_extent": 16,
      "ownership": "Live owner required; call-only copied inputs, host-session borrowed table. No allocation or engine pointers cross boundary. Camera lease exclusive; no steal.",
      "purpose": "Zone-local ray; direction normalized, positive finite distance clamped to 20000m. At most 32 unique nonzero current own IDs, copied for call only; foreign/relinquished ID FAILED, malformed input BAD_ARG. Adequately-sized hit zeroed on failure, unknown tail untouched; success position/distance only, entity/normal/flags zero. NULL/short hit rejected before zeroing. Capability game.world.raycast_filtered remains OFF.",
      "reentrancy": "Recursive calls refused with FAILED; no waits or async work.",
      "results": "BAD_ARG invalid owner/input; WRONG_THREAD; UNAVAILABLE absent verified adapter or restart-required; FAILED foreign owner/provider refusal; NOT_FOUND stale lease/no hit. See method-specific output contract.",
      "service": "game.world.control",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, const double *, const double *, double, const uint64_t *, uint32_t, sc_world_hit *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_world_control.h",
      "symbol": "sc_world_control_v1.raycast_filtered",
      "table": "sc_world_control_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_world_control.c",
        "tests/test_world_control.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD without provider access.",
      "version_macro": "SC_WORLD_CONTROL_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*camera)(double out_pos[3], double out_rot_xyzw[4], uint64_t* out_zone_id);`<br>The camera you see through: *out_pos in the world frame (metres), *out_rot_xyzw the same frame's rotation (x, y, z, w), *out_zone_id the zone your player is in (so you can convert with teleport.spatial). No fov (see above). Any pointer may be NULL to skip it, not all. SCO_NOT_FOUND: you haven't spawned yet. SCO_UNAVAILABLE: game.world.camera isn't ready. SCO_FAILED: the game faulted. Outputs are zeroed on failure.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-world-v1-camera",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world.h",
              "token": "(*camera)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_world.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world.hpp",
              "token": "return t_->camera(pos, rot, &zone);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_world.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/World.cs",
              "token": "ScoResult r = _t->camera(pos, rot, &zone);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(w, sc_world_v1, camera) ? w->camera(pos, rot, &zone) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; no allocation crosses boundary; queries do not own entities. Internal allocation unspecified.",
      "purpose": "The camera you see through: *out_pos in the world frame (metres), *out_rot_xyzw the same frame's rotation (x, y, z, w), *out_zone_id the zone your player is in (so you can convert with teleport.spatial). No fov (see above). Any pointer may be NULL to skip it, not all. SCO_NOT_FOUND: you haven't spawned yet. SCO_UNAVAILABLE: game.world.camera isn't ready. SCO_FAILED: the game faulted. Outputs are zeroed on failure.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; BAD_ARG for invalid required outputs. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.world",
      "signature": "sco_result (*)(double *, double *, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sc_world.h",
      "symbol": "sc_world_v1.camera",
      "table": "sc_world_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_world.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_WORLD_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND; game.world.free_camera_flag OFF: UNAVAILABLE",
      "buffer_contract": "`sco_result (*free_camera_flag)(uint32_t* out_set);`<br>*out_set = 1 when the game's free-camera flag (the byte its own free-camera disable command tests) is non-zero, else 0. Only reads; it neither turns the free camera on nor off, and nothing pins what the flag shows on screen yet, which is why game.world.free_camera_flag is OFF. SCO_BAD_ARG: out_set is NULL. SCO_UNAVAILABLE: game.world.free_camera_flag isn't ready. SCO_FAILED: the game faulted. *out_set is 0 on every failure.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous read-only query, nothing to undo at unload.",
      "examples": [],
      "id": "sc-world-v1-free-camera-flag",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world.h",
              "token": "(*free_camera_flag)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_world.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world.hpp",
              "token": "const sco_result r = t_->free_camera_flag(&raw);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_language_routes.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/World.cs",
              "token": "ScoResult r = _t->free_camera_flag(&raw);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(w, sc_world_v1, free_camera_flag) ? w->free_camera_flag(&set) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Capability OFF by default pending an in-game run.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 40,
      "ownership": "Caller output; nothing owned and nothing kept per plugin. No allocation crosses the boundary; internal allocation unspecified.",
      "purpose": "*out_set = 1 when the game's free-camera flag (the byte its own free-camera disable command tests) is non-zero, else 0. Only reads; it neither turns the free camera on nor off, and nothing pins what the flag shows on screen yet, which is why game.world.free_camera_flag is OFF. SCO_BAD_ARG: out_set is NULL. SCO_UNAVAILABLE: game.world.free_camera_flag isn't ready. SCO_FAILED: the game faulted. *out_set is 0 on every failure.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; a 1.0 table: query_service UNAVAILABLE for SC_WORLD_VERSION_1_1 (or check size); game.world.free_camera_flag OFF (the default): UNAVAILABLE without a game read; NULL out_set: BAD_ARG. Other failures as in the buffer contract.",
      "service": "game.world",
      "signature": "sco_result (*)(uint32_t *)",
      "since": "`size >= 40`; 1.1",
      "source_header": "include/sc_world.h",
      "symbol": "sc_world_v1.free_camera_flag",
      "table": "sc_world_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_world.c",
        "tests/test_world_free_cam.cpp",
        "tests/test_language_routes.cpp",
        "tests/test_sdk.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs",
        "tests/test_lua.cpp"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_WORLD_VERSION_1_1"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The reason for the last failed call of any plugin (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). The queries keep no per-plugin state, so self is only checked: NULL or a loaded plugin's handle (anything else is SCO_BAD_ARG). Any thread.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-world-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_world.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_world.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/World.cs",
              "token": "return Storage.Sized((buf, size) => ((ScWorldV1*)t)->last_error((void*)self, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "if (GAME_MEMBER(w, sc_world_v1, last_error) && w->last_error(NULL, msg, &size) == SCO_OK && msg[0]) { lua_pushstring(L, msg); return 3; }"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "recursive reentrancy unspecified.",
        "stopped-service refusal unspecified (no started check).",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; no allocation crosses boundary; queries do not own entities. Internal allocation unspecified.",
      "purpose": "The reason for the last failed call of any plugin (\"\" if none), NUL-terminated, with the size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). The queries keep no per-plugin state, so self is only checked: NULL or a loaded plugin's handle (anything else is SCO_BAD_ARG). Any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released non-NULL self or buffer; TOO_MANY required bytes. Shared error across all query callers; stopped-service refusal unspecified (no started check).",
      "service": "game.world",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sc_world.h",
      "symbol": "sc_world_v1.last_error",
      "table": "sc_world_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_world.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Any thread; diagnostic scope as described; recursive reentrancy unspecified.",
      "version_macro": "SC_WORLD_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*raycast)(uint64_t zone_id, const double from[3], const double dir[3], double max_dist, sc_world_hit* out_hit);`<br>Casts a ray from from (metres, in zone zone_id's local frame) along dir (any non-zero length; it is normalised) for at most max_dist metres, and fills *out_hit (out_hit-&gt;size must be sizeof(sc_world_hit)). max_dist must be positive and finite; one over SC_WORLD_RAY_MAX_DISTANCE is clamped to it. The cast tries the zone and then up to two of its parents (never the world's root zone), as sc-offline's build mode does, and reports the first hit, in the frame of zone_id. Nothing is skipped: your own player's body can be hit. SCO_OK: hit. SCO_NOT_FOUND: nothing hit within max_dist (last_error says \"no hit\"), or the zone isn't streamed in, or you haven't spawned. SCO_BAD_ARG: a NULL pointer, zone 0, a non-finite or zero direction, a bad max_dist or a too-small out_hit-&gt;size. SCO_UNAVAILABLE: game.world.raycast isn't ready. SCO_FAILED: the game faulted. *out_hit is zeroed (apart from size) on every failure. Implementation: NULL/undersized hit rejected before zeroing; adequately-sized hit is zeroed excluding size, only known fields written. Unknown caller tail untouched.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous query.",
      "examples": [],
      "id": "sc-world-v1-raycast",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sc_world.h",
              "token": "(*raycast)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_game_world.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/game/world.hpp",
              "token": "return t_->raycast(zone, from, dir, maxDist, &hit);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_game_world.c",
            "tests/test_app.cpp",
            "tests/test_sdk.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Game/World.cs",
              "token": "r = _t->raycast(zoneId, f, d, maxDist, &h);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(w, sc_world_v1, raycast) ? w->raycast(zone, from, dir, max, &hit) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Game-service behavior not verified in a game session."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; no allocation crosses boundary; queries do not own entities. Internal allocation unspecified.",
      "purpose": "Casts a ray from from (metres, in zone zone_id's local frame) along dir (any non-zero length; it is normalised) for at most max_dist metres, and fills *out_hit (out_hit-&gt;size must be sizeof(sc_world_hit)). max_dist must be positive and finite; one over SC_WORLD_RAY_MAX_DISTANCE is clamped to it. The cast tries the zone and then up to two of its parents (never the world's root zone), as sc-offline's build mode does, and reports the first hit, in the frame of zone_id. Nothing is skipped: your own player's body can be hit. SCO_OK: hit. SCO_NOT_FOUND: nothing hit within max_dist (last_error says \"no hit\"), or the zone isn't streamed in, or you haven't spawned. SCO_BAD_ARG: a NULL pointer, zone 0, a non-finite or zero direction, a bad max_dist or a too-small out_hit-&gt;size. SCO_UNAVAILABLE: game.world.raycast isn't ready. SCO_FAILED: the game faulted. *out_hit is zeroed (apart from size) on every failure. Implementation: NULL/undersized hit rejected before zeroing; adequately-sized hit is zeroed excluding size, only known fields written. Unknown caller tail untouched.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; missing operation capability: UNAVAILABLE; BAD_ARG for invalid required outputs. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "game.world",
      "signature": "sco_result (*)(uint64_t, const double *, const double *, double, sc_world_hit *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sc_world.h",
      "symbol": "sc_world_v1.raycast",
      "table": "sc_world_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_game_world.c",
        "tests/test_app.cpp",
        "tests/test_lua.cpp",
        "tests/test_sdk.cpp",
        "sdk/csharp/Sco.Sdk.Tests/GameFakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/GameLayout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); last_error any thread. Recursive reentrancy unspecified.",
      "version_macro": "SC_WORLD_VERSION_1_1"
    },
    {
      "absent_capability": "1 available; 0 absent/unknown/NULL name.",
      "buffer_contract": "`int (*has)(const char* capability);`<br>1 if the capability is available on this game build, else 0.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-has",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*has)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "bool Has(const char* capability) const noexcept { return api_ && capability && api_->has(capability) != 0; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "fixed (byte* c = Utf8.Z(capability)) return a->has(c) != 0;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "lua_pushboolean(L, Of(L)->api->has(luaL_checkstring(L, 1)) != 0);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 24,
      "ownership": "Capability string borrowed during call; no allocation transfer; fixed registry lookup.",
      "purpose": "1 if the capability is available on this game build, else 0.",
      "reentrancy": "unspecified",
      "results": "1 available; 0 absent/unknown/NULL name. No result/error channel.",
      "service": "sco_api",
      "signature": "int (*)(const char *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.has",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`const char* (*host_version)(void);`<br>\"sc-offline 0.8.0\". Static string.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-host-version",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*host_version)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*host_version)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "return a == null ? \"\" : Utf8.Read(a->host_version()) ?? \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const char* v = Of(L)->api->host_version();"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "reentrancy unspecified."
      ],
      "member_extent": 16,
      "ownership": "Borrowed static host string; never free. Internal allocation unspecified.",
      "purpose": "\"sc-offline 0.8.0\". Static string.",
      "reentrancy": "unspecified",
      "results": "No result/error channel. No capability gate. NULL before host version setup possible in implementation; published-host lifetime is host-owned.",
      "service": "sco_api",
      "signature": "const char *(*)(void)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.host_version",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*invoke)(sco_plugin* self, const char* name, const sco_arg* args, uint32_t nargs, sco_invoke_done done, void* ctx);`<br>From the game thread: runs now, calls done (if set) once before returning, and returns the same result. From another thread: copies name and args, queues the call and returns SCO_OK; done then runs exactly once, on the game thread. Any other return (SCO_BAD_ARG, or SCO_TOO_MANY when the queue is full or memory runs out) means nothing was queued and done is never called. A call still queued when the plugin unloads is dropped without calling done.",
      "callback_context": "on game thread command/done run synchronously; elsewhere queued and done runs on game thread.",
      "cleanup": "Queued call dropped on calling owner release without done; non-OK enqueue return means done never runs. No invocation-specific cancellation.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-invoke",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*invoke)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "if (!reply) return api_->invoke(self_, name, args, nargs, nullptr, nullptr);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "r = a->invoke(_self, n, block.Args, block.Count, &DoneTrampoline, (void*)id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = s->api->invoke(s->self, name, nargs ? args : NULL, (uint32_t)nargs, DoneCb, &d);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "Runs any command, sc-offline's or a plugin's, now."
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive invoke depth/limit unspecified."
      ],
      "member_extent": 80,
      "ownership": "On game thread, arguments borrowed during call. Else name/arguments/string values copied into host queue allocations; done/ctx borrowed. reply borrowed during done only.",
      "purpose": "From the game thread: runs now, calls done (if set) once before returning, and returns the same result. From another thread: copies name and args, queues the call and returns SCO_OK; done then runs exactly once, on the game thread. Any other return (SCO_BAD_ARG, or SCO_TOO_MANY when the queue is full or memory runs out) means nothing was queued and done is never called. A call still queued when the plugin unloads is dropped without calling done.",
      "reentrancy": "unspecified",
      "results": "Game thread: command result incl NOT_FOUND, BAD_ARG, UNAVAILABLE capability, CRASHED guarded fault, or provider result. Other thread: OK queued, BAD_ARG/TOO_MANY nothing queued. Initial validation can return before done.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, const sco_arg *, uint32_t, sco_invoke_done, void *)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.invoke",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; on game thread command/done run synchronously; elsewhere queued and done runs on game thread. Recursive invoke depth/limit unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*invoke_raw)(sco_plugin* self, const char* name, const void* in_bytes, uint32_t in_size, void* out_bytes, uint32_t* inout_out_size);`<br>Game thread. Calls the raw handler registered under name, now: in_size bytes in, up to *inout_out_size bytes out (on return: bytes written, or needed with SCO_TOO_MANY). in may be NULL with in_size 0; out may be NULL with *inout_out_size 0 (asks the size), and inout_out_size NULL when no output is wanted. SCO_NOT_FOUND, SCO_UNAVAILABLE (capability missing), SCO_WRONG_THREAD (other threads), SCO_CRASHED (the handler faulted).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-invoke-raw",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*invoke_raw)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/raw.hpp",
              "token": "const sco_result r = plugin.Api()->invoke_raw(plugin.Self(), name, in.empty() ? nullptr : in.data(),"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Services.cs",
              "token": "r = a->invoke_raw(SelfPtr, n, i, (uint)input.Length, o, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "recursive raw-handler invocation unspecified.",
        "Error output-byte contents unspecified."
      ],
      "member_extent": 120,
      "ownership": "in/out are caller buffers borrowed synchronously; layout and byte ownership are handler contract. Host does not keep bytes.",
      "purpose": "Game thread. Calls the raw handler registered under name, now: in_size bytes in, up to *inout_out_size bytes out (on return: bytes written, or needed with SCO_TOO_MANY). in may be NULL with in_size 0; out may be NULL with *inout_out_size 0 (asks the size), and inout_out_size NULL when no output is wanted. SCO_NOT_FOUND, SCO_UNAVAILABLE (capability missing), SCO_WRONG_THREAD (other threads), SCO_CRASHED (the handler faulted).",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid self/name/buffer combinations; WRONG_THREAD; NOT_FOUND; UNAVAILABLE handler gate; CRASHED fault (out size 0); TOO_MANY required size/overstated output; other handler result. Error output-byte contents unspecified.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, const void *, uint32_t, void *, uint32_t *)",
      "since": "`size >= 120`; 1.1",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.invoke_raw",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Game thread only (WRONG_THREAD elsewhere); recursive raw-handler invocation unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`uint32_t (*list_commands)(const sco_command** out, uint32_t max);`<br>Writes up to max command pointers to out; returns the number of live commands. The pointers stay valid until their owning plugin unloads.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-list-commands",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*list_commands)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*list_commands)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Interop.cs",
              "token": "public delegate* unmanaged[Cdecl]<ScoCommand**, uint, uint> list_commands;"
            }
          ],
          "status": "direct",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "uint32_t n = s->api->list_commands(list, 512);"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (n > 512) n = 512;"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation unspecified.",
        "reentrancy unspecified."
      ],
      "member_extent": 88,
      "ownership": "out array caller-owned; command pointers host-owned until owner unload/slot reuse. Keep names, not pointers. Internal allocation unspecified.",
      "purpose": "Writes up to max command pointers to out; returns the number of live commands. The pointers stay valid until their owning plugin unloads.",
      "reentrancy": "unspecified",
      "results": "Returns total live count, not number written; NULL out or max 0 counts only. No result/error channel or capability gate.",
      "service": "sco_api",
      "signature": "uint32_t (*)(const sco_command **, uint32_t)",
      "since": "`size >= 88`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.list_commands",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`void (*log)(sco_plugin* self, sco_log_level level, const char* message);`<br>Logs [plugin] message on one line; warn/error add a tag, CR/LF become spaces and long message is cut.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-log",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*log)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "api->log(self, SCO_LOG_ERROR, line);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "fixed (byte* m = Utf8.Z(message)) api->log(self, level, m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "s->api->log(s->self, SCO_LOG_ERROR, line);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 64,
      "ownership": "Message borrowed for call, copied/sanitized through 512-byte stack buffer; no allocation transfer.",
      "purpose": "Logs [plugin] message on one line; warn/error add a tag, CR/LF become spaces and long message is cut.",
      "reentrancy": "unspecified",
      "results": "void; invalid/released self or NULL message silently ignored; CR/LF become spaces and message truncates; unknown level follows info branch. No capability gate.",
      "service": "sco_api",
      "signature": "void (*)(sco_plugin *, sco_log_level, const char *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.log",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*provide_service)(sco_plugin* self, const char* name, uint32_t version, const void* vtable);`<br>Any thread. Publishes vtable under name (\"&lt;plugin id&gt;\" or \"&lt;plugin id&gt;.&lt;name&gt;\", [a-z0-9_.], 1-63 chars) with version (major &lt;&lt; 16) &#124; minor. SCO_BAD_ARG: a bad or taken name, or a name outside this plugin's id. Withdrawn when this plugin unloads or crashes, or by release_service. Start the table with a uint32_t size so it can grow.",
      "callback_context": "unspecified",
      "cleanup": "release_service or owner unload/crash withdraws lookup; no cancellation/quiescence guarantee for calls already using table.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-provide-service",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*provide_service)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/service.hpp",
              "token": "return plugin.Api()->provide_service(plugin.Self(), name, version, table);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Services.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) return a->provide_service(SelfPtr, n, version, table);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 96,
      "ownership": "Host copies name/version, borrows table contents/code until withdrawal or unload; provider retains state ownership. Registry allocation may fail.",
      "purpose": "Any thread. Publishes vtable under name (\"&lt;plugin id&gt;\" or \"&lt;plugin id&gt;.&lt;name&gt;\", [a-z0-9_.], 1-63 chars) with version (major &lt;&lt; 16) &#124; minor. SCO_BAD_ARG: a bad or taken name, or a name outside this plugin's id. Withdrawn when this plugin unloads or crashes, or by release_service. Start the table with a uint32_t size so it can grow.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released self, NULL table, invalid/taken/out-of-prefix name; TOO_MANY allocation. No capability gate.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint32_t, const void *)",
      "since": "`size >= 96`; 1.1",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.provide_service",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "NOT_FOUND absent; UNAVAILABLE incompatible major/older minor",
      "buffer_contract": "`sco_result (*query_service)(const char* name, uint32_t min_version, const void** out_vtable);`<br>Any thread. SCO_OK: *out_vtable = the table of the service with this name, same major as min_version and at least as new. SCO_UNAVAILABLE: another major, or older. SCO_NOT_FOUND: none. *out_vtable is NULL unless SCO_OK. A plugin's table goes away when it unloads: query when needed.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation. Native provider hot reload/unload during session refused after handout; shutdown still tears down state. Do not assume held state stays usable after withdrawal/crash.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-query-service",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*query_service)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/service.hpp",
              "token": "const sco_result r = api->query_service(name, minVersion, &out);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Services.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) r = a->query_service(n, minVersion, &table);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "s->api->query_service(SCO_STORAGE_NAME, SCO_STORAGE_VERSION_1_0, &t)"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 104,
      "ownership": "Returns borrowed provider table; never free. Host/game tables live through plugin lifetime. Native provider code remains mapped after handout, not necessarily its state. Handout tracking may allocate.",
      "purpose": "Any thread. SCO_OK: *out_vtable = the table of the service with this name, same major as min_version and at least as new. SCO_UNAVAILABLE: another major, or older. SCO_NOT_FOUND: none. *out_vtable is NULL unless SCO_OK. A plugin's table goes away when it unloads: query when needed.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG NULL name/out; NOT_FOUND absent; UNAVAILABLE incompatible major/older minor; TOO_MANY handout-tracking allocation. *out NULL unless OK.",
      "service": "sco_api",
      "signature": "sco_result (*)(const char *, uint32_t, const void **)",
      "since": "`size >= 104`; 1.1",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.query_service",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "Missing command capability gates invocation, not registration.",
      "buffer_contract": "`sco_result (*register_command)(sco_plugin* self, const sco_command* cmd);`<br>Commands: the one way to use a feature. The host copies cmd, its strings and its arg defs; only fn and ctx must stay valid until the plugin unloads.",
      "callback_context": "unspecified",
      "cleanup": "Owner unload/crash removes registration; no individual unregister API.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-register-command",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*register_command)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/command.hpp",
              "token": "const sco_result r = plugin_.Api()->register_command(plugin_.Self(), &cmd);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Commands.cs",
              "token": "ScoResult r = api->register_command(_plugin.SelfPtr, &cmd);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = s->api->register_command(s->self, &cmd);"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (s->ncmds == SCO_LUA_MAX_COMMANDS) return PushResult(L, SCO_TOO_MANY);"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 72,
      "ownership": "Host copies descriptor strings and argument definitions; only fn/ctx borrowed until unload. Registry slots host-owned; no allocation transfer.",
      "purpose": "Commands: the one way to use a feature. The host copies cmd, its strings and its arg defs; only fn and ctx must stay valid until the plugin unloads.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid descriptor/size/stride, args/type/name/prefix or duplicate; TOO_MANY capacity/allocation. Missing command capability gates invocation, not registration.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const sco_command *)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.register_command",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "Missing capability gates invocation, not registration.",
      "buffer_contract": "`sco_result (*register_raw)(sco_plugin* self, const char* name, const char* capability, sco_raw_fn fn, void* ctx);`<br>Any thread. Registers fn under name (\"&lt;plugin id&gt;.&lt;name&gt;\", the command name rule), gated on capability (NULL: none). Only fn and ctx are borrowed, until this plugin unloads. SCO_BAD_ARG: a bad or taken name.",
      "callback_context": "unspecified",
      "cleanup": "Owner unload/crash removes registration; no individual unregister API.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-register-raw",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*register_raw)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/raw.hpp",
              "token": "plugin.Api()->register_raw(plugin.Self(), name, capability, detail::RawTrampoline, detail::ToCtx(id));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Services.cs",
              "token": "r = a->register_raw(SelfPtr, n, c, &RawTrampoline, (void*)id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 128,
      "ownership": "Name/capability copied; fn/ctx borrowed until unload/crash. Host records and registry own allocations, not ctx.",
      "purpose": "Any thread. Registers fn under name (\"&lt;plugin id&gt;.&lt;name&gt;\", the command name rule), gated on capability (NULL: none). Only fn and ctx are borrowed, until this plugin unloads. SCO_BAD_ARG: a bad or taken name.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released self, NULL fn, bad/taken/out-of-prefix name or capability syntax; TOO_MANY raw registry capacity/allocation or 1024 successful wrapper registrations over process lifetime. Missing capability gates invocation, not registration.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *, sco_raw_fn, void *)",
      "since": "`size >= 128`; 1.1",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.register_raw",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*release_service)(sco_plugin* self, const char* name);`<br>Any thread. Withdraws one of this plugin's services. SCO_NOT_FOUND: it publishes nothing by that name.",
      "callback_context": "unspecified",
      "cleanup": "Stops future lookup; effects on calls already executing unspecified.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-release-service",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*release_service)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/service.hpp",
              "token": "return plugin.Api()->release_service(plugin.Self(), name);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Services.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) return a->release_service(SelfPtr, n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "The script sees only:"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "There is no `io`, `os`, `package`, `require`, `debug`, `dofile`, `loadfile` or FFI"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Concurrency/quiescence for callers holding it unspecified.",
        "reentrancy unspecified.",
        "effects on calls already executing unspecified."
      ],
      "member_extent": 112,
      "ownership": "Withdraws borrowed pointer, never frees provider table. Concurrency/quiescence for callers holding it unspecified.",
      "purpose": "Any thread. Withdraws one of this plugin's services. SCO_NOT_FOUND: it publishes nothing by that name.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid self or NULL name; NOT_FOUND no owned service (including one already withdrawn). No capability gate; released-self handling not an explicit wrapper check.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 112`; 1.1",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.release_service",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*run_on_game_thread)(sco_plugin* self, sco_task_fn fn, void* ctx);`<br>Any thread. Runs fn(ctx) on the game thread, in order, on the next tick. SCO_TOO_MANY only when 65536 tasks are already waiting (the host's cap) or memory runs out.",
      "callback_context": "Runs fn(ctx) on the game thread, in order, on the next tick.",
      "cleanup": "Queued tasks dropped on unload/failed load/crash; no task-specific cancel or drop notification; caller must clean ctx.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-run-on-game-thread",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*run_on_game_thread)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "const sco_result r = api_->run_on_game_thread(self_, detail::TaskTrampoline, detail::ToCtx(id));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "ScoResult r = a->run_on_game_thread(_self, &TaskTrampoline, (void*)id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = s->api->run_on_game_thread(s->self, TaskThunk, t);"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (s->ntasks >= SCO_LUA_MAX_TASKS) return PushResult(L, SCO_TOO_MANY);"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 32,
      "ownership": "fn/ctx borrowed until execution or owner release; ctx is not copied/freed. First 256 waiting tasks use fixed ring; overflow allocates nodes up to 65,536 waiting tasks.",
      "purpose": "Any thread. Runs fn(ctx) on the game thread, in order, on the next tick. SCO_TOO_MANY only when 65536 tasks are already waiting (the host's cap) or memory runs out.",
      "reentrancy": "unspecified",
      "results": "OK queued; BAD_ARG invalid/released self or NULL fn; TOO_MANY at queue hard cap or allocation failure; no capability gate.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, sco_task_fn, void *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.run_on_game_thread",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`void (*status)(sco_plugin* self, const char* message);`<br>Shows &lt;plugin&gt;: message on status line. CR/LF become spaces; NULL/invalid self ignored; longer message cut to fit the host buffer.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous unless noted.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-status",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*status)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "api_->status(self_, line);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "fixed (byte* m = Utf8.Z(message)) a->status(_self, m);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "s->api->status(s->self, line);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 56,
      "ownership": "Message borrowed for call, copied/sanitized through 256-byte stack buffer; no allocation transfer.",
      "purpose": "Shows &lt;plugin&gt;: message on status line. CR/LF become spaces; NULL/invalid self ignored; longer message cut to fit the host buffer.",
      "reentrancy": "unspecified",
      "results": "void; invalid/released self or NULL message silently ignored; CR/LF become spaces and message truncates. No capability gate.",
      "service": "sco_api",
      "signature": "void (*)(sco_plugin *, const char *)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.status",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "Missing event producer is not a registration error; no event may arrive.",
      "buffer_contract": "`sco_result (*subscribe)(sco_plugin* self, const char* event, sco_event_fn fn, void* ctx);`<br>Any thread. Applies from the next dispatch.",
      "callback_context": "unspecified",
      "cleanup": "unsubscribe or owner unload/crash ends delivery; in-flight callback may finish.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-subscribe",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*subscribe)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "const sco_result r = api_->subscribe(self_, event, detail::EventTrampoline, detail::ToCtx(id));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "fixed (byte* n = Utf8.Z(ev)) r = _api->subscribe(_self, n, EventFn, (void*)slot.Id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = s->api->subscribe(s->self, event, sco_lua_event_, e);"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (lua_rawlen(L, list) >= SCO_LUA_MAX_SUBSCRIBERS) return PushResult(L, SCO_TOO_MANY);"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "reentrancy unspecified."
      ],
      "member_extent": 40,
      "ownership": "Event name copied; fn/ctx borrowed until unsubscribe/unload. Host allocates copy-on-write subscription list; caller owns ctx.",
      "purpose": "Any thread. Applies from the next dispatch.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released self, NULL/empty event, NULL fn or duplicate (self,event,fn); TOO_MANY capacity/allocation failure. Missing event producer is not a registration error; no event may arrive.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, sco_event_fn, void *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.subscribe",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*unsubscribe)(sco_plugin* self, const char* event, sco_event_fn fn);`<br>Any thread. Applies at once: a running dispatch won't call fn again. Freeing ctx: on the game thread, right after unsubscribe returns (also from inside fn itself). From another thread fn may be running now; call run_on_game_thread after unsubscribe returns and free ctx in that task. Tasks never run while a dispatch is in progress.",
      "callback_context": "unspecified",
      "cleanup": "On successful removal no new callback, including remainder of current dispatch; off-thread already-running callback may finish. Free ctx via later game-thread task.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-api-unsubscribe",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "(*unsubscribe)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "s->api->unsubscribe(s->self, it->first.c_str(), detail::EventTrampoline);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_app.cpp",
            "tests/test_datacore_service.cpp",
            "tests/test_host.cpp",
            "tests/test_ipc.cpp",
            "tests/test_net_service.cpp",
            "tests/test_plugins.cpp",
            "tests/test_sdk.cpp",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Plugin.cs",
              "token": "fixed (byte* n = Utf8.Z(slot.Event)) _api->unsubscribe(_self, n, EventFn);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "s->api->unsubscribe(s->self, e->name, sco_lua_event_);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "other reentrancy unspecified."
      ],
      "member_extent": 48,
      "ownership": "Caller owns fn/ctx. Host may allocate replacement subscription list. Follow callback-quiescence rule before freeing ctx.",
      "purpose": "Any thread. Applies at once: a running dispatch won't call fn again. Freeing ctx: on the game thread, right after unsubscribe returns (also from inside fn itself). From another thread fn may be running now; call run_on_game_thread after unsubscribe returns and free ctx in that task. Tasks never run while a dispatch is in progress.",
      "reentrancy": "allowed inside own event callback.",
      "results": "BAD_ARG invalid/released self or NULL event/fn; NOT_FOUND no matching subscription; TOO_MANY replacement-list allocation failure. No capability gate.",
      "service": "sco_api",
      "signature": "sco_result (*)(sco_plugin *, const char *, sco_event_fn)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_api.h",
      "symbol": "sco_api.unsubscribe",
      "table": "sco_api",
      "table_size": 128,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_app.cpp",
        "tests/test_datacore_service.cpp",
        "tests/test_host.cpp",
        "tests/test_ipc.cpp",
        "tests/test_lua.cpp",
        "tests/test_net_service.cpp",
        "tests/test_plugins.cpp",
        "tests/test_sdk.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; allowed inside own event callback. Does not join off-thread in-flight callback; other reentrancy unspecified.",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "Query NOT_FOUND when service absent; no game capability required.",
      "buffer_contract": "`sco_result (*item)(sco_plugin* self, sco_content_kind kind, uint32_t ordinal, sco_content_item* out);`<br>Copies one supported list/script record by zero-based kind ordinal in plugin/name order. Caller sets size >= sizeof(sco_content_item). Duplicate names retain distinct IDs. Failure leaves output untouched.",
      "callback_context": "No callbacks.",
      "cleanup": "No cancel or per-owner resource; host Stop clears snapshot and invalidates IDs. Table storage is process-lifetime; packs require restart.",
      "examples": [
        "sdk/examples/content_reader/content_reader.c"
      ],
      "id": "sco-content-v1-item",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_content.h",
              "token": "(*item)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_content.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/content.hpp",
              "token": "table_->item("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_content.cpp",
            "tests/abi_content.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/content-access.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/content-access.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "List/script kinds only; script bytes are not permission to execute.",
        "No C# or Lua binding. Windows file handling and gameplay unverified."
      ],
      "member_extent": 16,
      "ownership": "Caller-owned copied records/bytes; host owns bounded startup snapshot. No paths, borrowed content pointers or allocation transfer.",
      "purpose": "Copies one supported list/script record by zero-based kind ordinal in plugin/name order. Caller sets size >= sizeof(sco_content_item). Duplicate names retain distinct IDs. Failure leaves output untouched.",
      "reentrancy": "No callouts; callable from a game-thread consumer callback while runtime admission is open.",
      "results": "Query NOT_FOUND when absent; UNAVAILABLE when stopped/terminal shutdown; WRONG_THREAD off game thread; BAD_ARG invalid/released self or invalid buffer/kind; NOT_FOUND ordinal end or unknown/stale ID; read TOO_MANY reports needed bytes.",
      "service": "sco.content",
      "signature": "sco_result (*)(sco_plugin *, sco_content_kind, uint32_t, sco_content_item *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_content.h",
      "symbol": "sco_content_v1.item",
      "table": "sco_content_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_content.c",
        "tests/test_content.cpp"
      ],
      "thread_affinity": "Game thread only; synchronous memory copies, no callouts or file IO.",
      "version_macro": "SCO_CONTENT_VERSION_1_0"
    },
    {
      "absent_capability": "Query NOT_FOUND when service absent; no game capability required.",
      "buffer_contract": "`sco_result (*read)(sco_plugin* self, uint64_t id, void* out, uint32_t* inout_size);`<br>Copies exact immutable startup bytes; no added NUL. Size handshake: capacity in, written on OK, needed on TOO_MANY. NULL out requires zero capacity; empty file is OK/0. Only TOO_MANY changes size on failure; no failed call writes bytes.",
      "callback_context": "No callbacks.",
      "cleanup": "No cancel or per-owner resource; host Stop clears snapshot and invalidates IDs. Table storage is process-lifetime; packs require restart.",
      "examples": [
        "sdk/examples/content_reader/content_reader.c"
      ],
      "id": "sco-content-v1-read",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_content.h",
              "token": "(*read)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_content.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/content.hpp",
              "token": "table_->read("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_content.cpp",
            "tests/abi_content.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/content-access.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/content-access.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "List/script kinds only; script bytes are not permission to execute.",
        "No C# or Lua binding. Windows file handling and gameplay unverified."
      ],
      "member_extent": 24,
      "ownership": "Caller-owned copied records/bytes; host owns bounded startup snapshot. No paths, borrowed content pointers or allocation transfer.",
      "purpose": "Copies exact immutable startup bytes; no added NUL. Size handshake: capacity in, written on OK, needed on TOO_MANY. NULL out requires zero capacity; empty file is OK/0. Only TOO_MANY changes size on failure; no failed call writes bytes.",
      "reentrancy": "No callouts; callable from a game-thread consumer callback while runtime admission is open.",
      "results": "Query NOT_FOUND when absent; UNAVAILABLE when stopped/terminal shutdown; WRONG_THREAD off game thread; BAD_ARG invalid/released self or invalid buffer/kind; NOT_FOUND ordinal end or unknown/stale ID; read TOO_MANY reports needed bytes.",
      "service": "sco.content",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, void *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_content.h",
      "symbol": "sco_content_v1.read",
      "table": "sco_content_v1",
      "table_size": 24,
      "tests": [
        "tests/abi_content.c",
        "tests/test_content.cpp"
      ],
      "thread_affinity": "Game thread only; synchronous memory copies, no callouts or file IO.",
      "version_macro": "SCO_CONTENT_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*add_instance)(uint64_t patch, const char* type, const char* clone_record, const char* clone_field, uint64_t* out_instance);`<br>A new instance of struct type, copied from clone_record's clone_field (NULL or \"\": the record's root) or zero-filled (clone_record NULL). out_instance: its id, usable in this patch's SCO_DC_INSTANCE values and set_pointer. Implementation initializes out_instance to 0 on failure.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-add-instance",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*add_instance)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "const sco_result r = t_->add_instance(id_, ty.c_str(), cr.empty() ? nullptr : cr.c_str(), cf.empty() ? nullptr : cf.c_str(), &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "r = t->add_instance(Id, ty, cr, cf, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->add_instance(p->id, type, cloneRecord, cloneField, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 40,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "A new instance of struct type, copied from clone_record's clone_field (NULL or \"\": the record's root) or zero-filled (clone_record NULL). out_instance: its id, usable in this patch's SCO_DC_INSTANCE values and set_pointer. Implementation initializes out_instance to 0 on failure.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, const char *, const char *, const char *, uint64_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.add_instance",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*add_record)(uint64_t patch, const char* type, const char* name, const char* guid, const char* clone_record, const char* file_path, uint64_t* out_record);`<br>1.1: a new record of struct type named name (unique among records), its root copied from the record clone_record (a name or \"guid:...\", required; a record of the same struct). guid: NULL or \"\" derives a stable one from the plugin id and name (the same at every launch); else \"xxxxxxxx-...\", not zero. file_path: NULL or \"\" is libs/foundry/records/sco/&lt;plugin id&gt;/&lt;name&gt;.xml; else libs/foundry/records/... ending in .xml. out_record: an id like add_instance's (the record's root: \"@&lt;id&gt;\" as a record argument, SCO_DC_INSTANCE as a value); later operations may also name the record by name or GUID, and reference fields take it as SCO_DC_REF. SCO_BAD_ARG: a bad argument, or a name or GUID this patch already adds. The rest (struct has records, name and GUID new to the file, clone's struct) is checked at the load. In the saved .toml it is a [[record]] operation. SCO_UNAVAILABLE on a 1.0 host. Implementation initializes out_record to 0 on failure.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-add-record",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*add_record)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "const sco_result r = t_->add_record(id_, a.c_str(), b.c_str(), c.empty() ? nullptr : c.c_str(), d.c_str(),"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "r = t->add_record(Id, ty, n, g, c, p, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->add_record(p->id, type, name, guid, clone, file, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 64,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "1.1: a new record of struct type named name (unique among records), its root copied from the record clone_record (a name or \"guid:...\", required; a record of the same struct). guid: NULL or \"\" derives a stable one from the plugin id and name (the same at every launch); else \"xxxxxxxx-...\", not zero. file_path: NULL or \"\" is libs/foundry/records/sco/&lt;plugin id&gt;/&lt;name&gt;.xml; else libs/foundry/records/... ending in .xml. out_record: an id like add_instance's (the record's root: \"@&lt;id&gt;\" as a record argument, SCO_DC_INSTANCE as a value); later operations may also name the record by name or GUID, and reference fields take it as SCO_DC_REF. SCO_BAD_ARG: a bad argument, or a name or GUID this patch already adds. The rest (struct has records, name and GUID new to the file, clone's struct) is checked at the load. In the saved .toml it is a [[record]] operation. SCO_UNAVAILABLE on a 1.0 host. Implementation initializes out_record to 0 on failure.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, const char *, const char *, const char *, const char *, const char *, uint64_t *)",
      "since": "`size >= 64`; 1.0 slot; works 1.1",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.add_record",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*append)(uint64_t patch, const char* record, const char* field, const sco_dc_value* v);`<br>Appends one element to an array field: a value, a pointer (SCO_DC_NULL, SCO_DC_INSTANCE), or for an array of structs SCO_DC_INSTANCE, the added instance to copy in.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-append",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*append)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "return appending_ ? t_->append(id_, rec.c_str(), f.c_str(), &v) : t_->set(id_, rec.c_str(), f.c_str(), &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "return t->append(Id, r, f, v.Ptr);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->append(p->id, record, field, v.type == SCO_DC_NULL ? NULL : &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 56,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "Appends one element to an array field: a value, a pointer (SCO_DC_NULL, SCO_DC_INSTANCE), or for an array of structs SCO_DC_INSTANCE, the added instance to copy in.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, const char *, const char *, const sco_dc_value *)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.append",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*begin)(sco_plugin* self, uint32_t flags, uint64_t* out_patch);`<br>A new patch owned by self. flags: 0 or SCO_DC_NON_ATOMIC. SCO_BAD_ARG: a bad self or flags. SCO_TOO_MANY: SCO_DC_MAX_PATCHES of this plugin's patches are open or queued for the load. Implementation initializes out_patch to 0 on failure.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-begin",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*begin)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "const sco_result r = ref_->begin(self_, flags, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "ScoResult r = _t->begin(_plugin.SelfPtr, flags, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->begin(self, flags, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "A new patch owned by self. flags: 0 or SCO_DC_NON_ATOMIC. SCO_BAD_ARG: a bad self or flags. SCO_TOO_MANY: SCO_DC_MAX_PATCHES of this plugin's patches are open or queued for the load. Implementation initializes out_patch to 0 on failure.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(sco_plugin *, uint32_t, uint64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.begin",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*commit)(uint64_t patch);`<br>Before the load: queues the patch for it (reports SCO_DC_QUEUED). After it: saves the patch as data/datacore/pending/&lt;plugin id&gt;.toml (written to a temporary file, then renamed over the old one) and reports SCO_DC_QUEUED \"applies at the next launch\"; an empty patch clears the saved one. No more operations on it either way. SCO_BAD_ARG: already committed. SCO_FAILED: the file couldn't be written (the patch stays open; commit again).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-commit",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*commit)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "const sco_result r = t_->commit(id_);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "ScoResult r = t->commit(Id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(dc, sco_datacore_v1, commit) ? dc->commit(p->id) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 72,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "Before the load: queues the patch for it (reports SCO_DC_QUEUED). After it: saves the patch as data/datacore/pending/&lt;plugin id&gt;.toml (written to a temporary file, then renamed over the old one) and reports SCO_DC_QUEUED \"applies at the next launch\"; an empty patch clears the saved one. No more operations on it either way. SCO_BAD_ARG: already committed. SCO_FAILED: the file couldn't be written (the patch stays open; commit again).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.commit",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*discard)(uint64_t patch);`<br>Drops a patch: an open one, or a committed one before the load. After it was saved or applied only the id is forgotten (delete the saved file by committing an empty patch).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-discard",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*discard)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "const sco_result r = detail::CanCall(t_, &sco_datacore_v1::discard) ? t_->discard(id_) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "ScoResult r = t->discard(Id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = GAME_MEMBER(dc, sco_datacore_v1, discard) ? dc->discard(p->id) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 80,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "Drops a patch: an open one, or a committed one before the load. After it was saved or applied only the id is forgotten (delete the saved file by committing an empty patch).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.discard",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*report)(uint64_t patch, uint32_t index, sco_dc_report* out);`<br>Entry index: 0 .. operations-1 are the operations in call order, then one entry for the patch itself (op_index SCO_DC_OP_PATCH). out-&gt;size must be at least sizeof(sco_dc_report). SCO_NOT_FOUND past the last entry or for an unknown, discarded or released patch.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-report",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*report)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "if (t_->report(id_, i, &rep) != SCO_OK) break;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "ScoResult r = t->report(Id, index, &rep);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->report(p->id, i, &rep);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 88,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "Entry index: 0 .. operations-1 are the operations in call order, then one entry for the patch itself (op_index SCO_DC_OP_PATCH). out-&gt;size must be at least sizeof(sco_dc_report). SCO_NOT_FOUND past the last entry or for an unknown, discarded or released patch.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, uint32_t, sco_dc_report *)",
      "since": "`size >= 88`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.report",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set)(uint64_t patch, const char* record, const char* field, const sco_dc_value* v);`<br>record: a record name, or \"guid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\". field: a field path, name / name[3] / name[Type] joined with '.'. Sets a value in place; v NULL or SCO_DC_NULL sets a null pointer, SCO_DC_INSTANCE points the field at an added instance. Implementation refuses duplicate set of same target/field within one patch with BAD_ARG.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-set",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*set)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "return appending_ ? t_->append(id_, rec.c_str(), f.c_str(), &v) : t_->set(id_, rec.c_str(), f.c_str(), &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "return t->set(Id, r, f, v.Ptr);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->set(p->id, record, field, v.type == SCO_DC_NULL ? NULL : &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "record: a record name, or \"guid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\". field: a field path, name / name[3] / name[Type] joined with '.'. Sets a value in place; v NULL or SCO_DC_NULL sets a null pointer, SCO_DC_INSTANCE points the field at an added instance. Implementation refuses duplicate set of same target/field within one patch with BAD_ARG.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, const char *, const char *, const sco_dc_value *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.set",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_pointer)(uint64_t patch, const char* record, const char* field, uint64_t instance);`<br>Points a strong or weak pointer field at an added instance. Uses set internally; therefore duplicate-target/field rule and value.size validation apply.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-set-pointer",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*set_pointer)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "return t_->set_pointer(id_, rec.c_str(), f.c_str(), target.Id());"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "return t->set_pointer(Id, r, f, instance);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "const sco_result r = dc->set_pointer(p->id, record, field, inst->id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 48,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "Points a strong or weak pointer field at an added instance. Uses set internally; therefore duplicate-target/field rule and value.size validation apply.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped operations: UNAVAILABLE. Unknown/released patch: NOT_FOUND; closed patch: BAD_ARG; operation cap: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.datacore",
      "signature": "sco_result (*)(uint64_t, const char *, const char *, uint64_t)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.set_pointer",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Absent table NOT_FOUND",
      "buffer_contract": "`uint32_t (*state)(void);`<br>SCO_DC_OPEN or SCO_DC_LOADED.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; discard drops open/queued patch, not applied or saved effects. Unload forgets owned patches.",
      "examples": [],
      "id": "sco-datacore-v1-state",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_datacore.h",
              "token": "(*state)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_datacore.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/datacore.hpp",
              "token": "uint32_t State() const noexcept { return detail::CanCall(ref_.Get(), &sco_datacore_v1::state) ? ref_->state() : SCO_DC_LOADED; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_datacore.c",
            "tests/test_datacore_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/DataCore.cs",
              "token": "public uint State => _t == null ? 0 : _t->state();"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua_game.c",
              "token": "lua_pushstring(L, dc->state() == SCO_DC_OPEN ? \"open\" : \"loaded\");"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Internal allocation/failure guarantee unspecified.",
        "Recursive/concurrent same-patch reentrancy unspecified.",
        "stopped-state value unspecified as a contract."
      ],
      "member_extent": 16,
      "ownership": "Strings/values copied; host owns patches and instances; IDs, not allocations, cross the ABI. Internal allocation/failure guarantee unspecified.",
      "purpose": "SCO_DC_OPEN or SCO_DC_LOADED.",
      "reentrancy": "unspecified",
      "results": "Returns OPEN or LOADED; no sco_result. Absent table NOT_FOUND; stopped-state value unspecified as a contract.",
      "service": "sco.datacore",
      "signature": "uint32_t (*)(void)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_datacore.h",
      "symbol": "sco_datacore_v1.state",
      "table": "sco_datacore_v1",
      "table_size": 88,
      "tests": [
        "tests/abi_datacore.c",
        "tests/test_datacore_service.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; short locks, no wait for game load. Recursive/concurrent same-patch reentrancy unspecified.",
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    {
      "absent_capability": "Requires explicit trusted host source opt-in, selected plugin ID and positive offline admission; grants no endpoint admission.",
      "buffer_contract": "`sco_result (*submit)(sco_plugin* self, const sco_diagnostics_observation_v1* observation);`<br>Copies a size-prefixed 8-byte observation; no pointers retained, output, text, identifiers or arbitrary fields.",
      "callback_context": "No callbacks.",
      "cleanup": "Host Stop clears ingress before shutdown callouts. Release/quarantine suppresses source; new owner starts empty. Borrowed table is process-lifetime; service reopen clears records.",
      "examples": [
        "sdk/examples/diagnostics_publisher/diagnostics_publisher.c"
      ],
      "id": "sco-diagnostics-publisher-v1-submit",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_diagnostics_publisher.h",
              "token": "(*submit)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_diagnostics_publisher.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/diagnostics_publisher.hpp",
              "token": "table_->submit("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_diagnostics_publisher.c",
            "tests/test_diagnostics_publishers.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/design/diagnostics-publishers.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/design/diagnostics-publishers.md",
              "token": "no C#/Lua binding"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Fixed advisory health only; no gameplay or runtime JSON v1 extra fields.",
        "No C#/Lua binding. Windows/MSVC and gameplay unverified."
      ],
      "member_extent": 16,
      "ownership": "Host-owned source buffer; selected live plugin only. Advisory health never establishes host/game readiness or faults.",
      "purpose": "Copies a size-prefixed 8-byte observation; no pointers retained, output, text, identifiers or arbitrary fields.",
      "reentrancy": "Callable from normal game-thread plugin callbacks; never called by capture or endpoint demand.",
      "results": "Query NOT_FOUND when default-off/absent; BAD_ARG invalid/released/unselected owner or null/short/unknown record; WRONG_THREAD off game thread; UNAVAILABLE stopped/terminal shutdown; TOO_MANY excess rate or allocation failure.",
      "service": "sco.diagnostics.publisher",
      "signature": "sco_result (*)(sco_plugin *, const sco_diagnostics_observation_v1 *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_diagnostics_publisher.h",
      "symbol": "sco_diagnostics_publisher_v1.submit",
      "table": "sco_diagnostics_publisher_v1",
      "table_size": 16,
      "tests": [
        "tests/abi_diagnostics_publisher.c",
        "tests/test_diagnostics_publishers.cpp"
      ],
      "thread_affinity": "Game thread only; synchronous memory copy, no callbacks or transport.",
      "version_macro": "SCO_DIAGNOSTICS_PUBLISHER_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*block_read)(sco_plugin* self, uint64_t channel, uint64_t offset, void* out, uint32_t size);`<br>Reads exactly size bytes of the block at offset. SCO_NOT_FOUND: never written. SCO_BAD_ARG: the writer's snapshot has another size. SCO_FAILED: the writer kept it torn; retry.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-block-read",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*block_read)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "return t_->block_read(self_, id_, offset, data.data(), static_cast<uint32_t>(data.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 40,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Reads exactly size bytes of the block at offset. SCO_NOT_FOUND: never written. SCO_BAD_ARG: the writer's snapshot has another size. SCO_FAILED: the writer kept it torn; retry.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, void *, uint32_t)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.block_read",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*block_write)(sco_plugin* self, uint64_t channel, uint64_t offset, const void* data, uint32_t size);`<br>Writes a seqlock snapshot of size bytes into the block at offset.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-block-write",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*block_write)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "return t_->block_write(self_, id_, offset, data.data(), static_cast<uint32_t>(data.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Writes a seqlock snapshot of size bytes into the block at offset.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, const void *, uint32_t)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.block_write",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*close)(sco_plugin* self, uint64_t channel);`<br>Marks the channel closed for the peer and unmaps it. SCO_NOT_FOUND: no such channel.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-close",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*close)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "if (detail::CanCall(t_, &sco_ipc_v1::close)) t_->close(self_, id_);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 80,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Marks the channel closed for the peer and unmaps it. SCO_NOT_FOUND: no such channel.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.close",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*create)(sco_plugin* self, const char* name, uint64_t bytes, uint32_t layout_id, uint32_t layout_version, uint64_t* out_channel);`<br>Creates (or, if the peer still holds it, re-opens) Local\\SCO_&lt;plugin id&gt;.&lt;name&gt; with bytes bytes and lays out the sc_ipc_hdr with the bridge's layout_id / layout_version and a new epoch (rings must be laid out again). SCO_BAD_ARG: a bad name or size, or a channel of that name already open. SCO_TOO_MANY: the channel or byte quota is full. SCO_FAILED: the OS refused, or an existing mapping of that name is smaller or another user's. New Windows mappings receive a current-user-only DACL; reuse checks ownership and size, not the existing DACL, so access by other accounts is not excluded on reuse.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-create",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*create)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "c.r_ = t_->create(self_, name, bytes, layoutId, layoutVersion, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 16,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Creates (or, if the peer still holds it, re-opens) Local\\SCO_&lt;plugin id&gt;.&lt;name&gt; with bytes bytes and lays out the sc_ipc_hdr with the bridge's layout_id / layout_version and a new epoch (rings must be laid out again). SCO_BAD_ARG: a bad name or size, or a channel of that name already open. SCO_TOO_MANY: the channel or byte quota is full. SCO_FAILED: the OS refused, or an existing mapping of that name is smaller or another user's. New Windows mappings receive a current-user-only DACL; reuse checks ownership and size, not the existing DACL, so access by other accounts is not excluded on reuse.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint64_t, uint32_t, uint32_t, uint64_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.create",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*peer_age_ms)(sco_plugin* self, uint64_t channel, uint32_t* out_ms);`<br>Milliseconds since the peer's last beat (capped at UINT32_MAX). SCO_NOT_FOUND: no such channel, or the peer hasn't beaten yet (*out_ms 0).",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-peer-age-ms",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*peer_age_ms)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "sco_result PeerAgeMs(uint32_t& ms) const noexcept { return detail::CanCall(t_, &sco_ipc_v1::peer_age_ms) ? t_->peer_age_ms(self_, id_, &ms) : (t_ ? SCO_UNAVAILABLE : r_); }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Milliseconds since the peer's last beat (capped at UINT32_MAX). SCO_NOT_FOUND: no such channel, or the peer hasn't beaten yet (*out_ms 0).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.peer_age_ms",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*ring_init)(sco_plugin* self, uint64_t channel, uint64_t offset, uint64_t capacity, uint32_t direction);`<br>Lays out an empty ring at offset with capacity data bytes (a power of two, at least 64), in one direction (SCO_IPC_TO_PEER or SCO_IPC_FROM_PEER). Re-initializing a ring at the same offset resets it. SCO_BAD_ARG: outside the mapping, overlapping another ring, a bad capacity or direction. SCO_TOO_MANY: SCO_IPC_MAX_RINGS already.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-ring-init",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*ring_init)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "return detail::CanCall(t_, &sco_ipc_v1::ring_init) ? t_->ring_init(self_, id_, offset, capacity, direction) : (t_ ? SCO_UNAVAILABLE : r_);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 48,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Lays out an empty ring at offset with capacity data bytes (a power of two, at least 64), in one direction (SCO_IPC_TO_PEER or SCO_IPC_FROM_PEER). Re-initializing a ring at the same offset resets it. SCO_BAD_ARG: outside the mapping, overlapping another ring, a bad capacity or direction. SCO_TOO_MANY: SCO_IPC_MAX_RINGS already.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, uint64_t, uint32_t)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.ring_init",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*ring_pop)(sco_plugin* self, uint64_t channel, uint64_t offset, uint32_t* out_type, void* out, uint32_t* inout_size);`<br>Takes the oldest record of the SCO_IPC_FROM_PEER ring at offset, with the size handshake: *inout_size holds out's capacity on entry, the record's size on return; with SCO_TOO_MANY the size needed, and the record stays queued (pass out NULL with *inout_size 0 to ask). out_type may be NULL. SCO_NOT_FOUND: empty, or no ring there. SCO_FAILED: the peer wrote something invalid.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-ring-pop",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*ring_pop)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "const sco_result r = t_->ring_pop(self_, id_, offset, &type, size ? out.data() : nullptr, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 64,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Takes the oldest record of the SCO_IPC_FROM_PEER ring at offset, with the size handshake: *inout_size holds out's capacity on entry, the record's size on return; with SCO_TOO_MANY the size needed, and the record stays queued (pass out NULL with *inout_size 0 to ask). out_type may be NULL. SCO_NOT_FOUND: empty, or no ring there. SCO_FAILED: the peer wrote something invalid.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, uint32_t *, void *, uint32_t *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.ring_pop",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*ring_push)(sco_plugin* self, uint64_t channel, uint64_t offset, uint32_t type, const void* data, uint32_t size);`<br>Appends one record to the SCO_IPC_TO_PEER ring at offset. SCO_TOO_MANY: full now. SCO_NOT_FOUND: no ring laid out there. SCO_BAD_ARG: a FROM_PEER ring, type 0xFFFFFFFF, or a record the ring can never hold.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-ring-push",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*ring_push)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "return t_->ring_push(self_, id_, offset, type, data.data(), static_cast<uint32_t>(data.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 56,
      "ownership": "Host owns mapping/channel; data copied via host staging buffers. No allocation transfer except borrowed view, never free it.",
      "purpose": "Appends one record to the SCO_IPC_TO_PEER ring at offset. SCO_TOO_MANY: full now. SCO_NOT_FOUND: no ring laid out there. SCO_BAD_ARG: a FROM_PEER ring, type 0xFFFFFFFF, or a record the ring can never hold.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint64_t, uint32_t, const void *, uint32_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.ring_push",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*view)(sco_plugin* self, uint64_t channel, void** out_base, uint64_t* out_bytes);`<br>The plugin's own mapping (header included) and its size, for bulk regions. Valid until close or unload; the host still validates everything it reads there.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation; close/ordinary unload/non-retained crash cleanup marks closed and unmaps channels. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-ipc-v1-view",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ipc.h",
              "token": "(*view)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ipc.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ipc.hpp",
              "token": "if (!detail::CanCall(t_, &sco_ipc_v1::view) || t_->view(self_, id_, &base, &bytes) != SCO_OK) return {};"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ipc.c",
            "tests/test_ipc.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ipc.md",
              "token": "Lua plugins get no `sco.ipc`"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "synchronization with close and direct-view access unspecified.",
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 72,
      "ownership": "Borrowed own mapping including header; valid until close/unload/crash. Never free; synchronization with close and direct-view access unspecified.",
      "purpose": "The plugin's own mapping (header included) and its size, for bulk regions. Valid until close or unload; the host still validates everything it reads there.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown/non-owned channel: NOT_FOUND; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ipc",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, void **, uint64_t *)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sco_ipc.h",
      "symbol": "sco_ipc_v1.view",
      "table": "sco_ipc_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ipc.c",
        "tests/test_ipc.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; per-channel lock during copy. Recursive reentrancy unspecified.",
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*get_peer_name)(uint64_t peer_id, char* buf, uint32_t cap);`<br>Copies the peer's chosen name (UTF-8) into buf, NUL-terminated, cut to cap - 1 bytes. SCO_NOT_FOUND: no such peer in the active session. SCO_BAD_ARG: buf NULL or cap 0.",
      "callback_context": "callbacks game thread.",
      "cleanup": "No delivery cancellation API; ordinary unload/non-retained crash cleanup drops channels and queued messages. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-get-peer-name",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*get_peer_name)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "if (!detail::CanCall(t_, &sco_net_v1::get_peer_name) || t_->get_peer_name(peer, buf, sizeof buf) != SCO_OK) return {};"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; sends copied, callbacks borrow buf for call only. Host owns channels/messages; no allocation transfer.",
      "purpose": "Copies the peer's chosen name (UTF-8) into buf, NUL-terminated, cut to cap - 1 bytes. SCO_NOT_FOUND: no such peer in the active session. SCO_BAD_ARG: buf NULL or cap 0.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "sco_result (*)(uint64_t, char *, uint32_t)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.get_peer_name",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*get_peers)(sco_net_peer* out, uint32_t* inout_count);`<br>The session's peers, self first, then by id. *inout_count holds out's capacity on entry (out may be NULL with 0) and the number of peers on return; up to the capacity are written. SCO_TOO_MANY: more peers than the capacity (the first ones were written). SCO_OK with 0 when no session is active. SCO_BAD_ARG: inout_count NULL, or out NULL with a nonzero capacity. Element-count handshake, not bytes: writes min(capacity,total) and returns total in inout_count; no session means OK/0.",
      "callback_context": "callbacks game thread.",
      "cleanup": "No delivery cancellation API; ordinary unload/non-retained crash cleanup drops channels and queued messages. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-get-peers",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*get_peers)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "const sco_result r = t_->get_peers(n ? out.data() : nullptr, &n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; sends copied, callbacks borrow buf for call only. Host owns channels/messages; no allocation transfer.",
      "purpose": "The session's peers, self first, then by id. *inout_count holds out's capacity on entry (out may be NULL with 0) and the number of peers on return; up to the capacity are written. SCO_TOO_MANY: more peers than the capacity (the first ones were written). SCO_OK with 0 when no session is active. SCO_BAD_ARG: inout_count NULL, or out NULL with a nonzero capacity. Element-count handshake, not bytes: writes min(capacity,total) and returns total in inout_count; no session means OK/0.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "sco_result (*)(sco_net_peer *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.get_peers",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`int (*is_active)(void);`<br>1 while a session is up (hosting, or joined with the channel table received), else 0.",
      "callback_context": "callbacks game thread.",
      "cleanup": "No delivery cancellation API; ordinary unload/non-retained crash cleanup drops channels and queued messages. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-is-active",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*is_active)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "bool Active() const noexcept { return detail::CanCall(t_, &sco_net_v1::is_active) && t_->is_active(); }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; sends copied, callbacks borrow buf for call only. Host owns channels/messages; no allocation transfer.",
      "purpose": "1 while a session is up (hosting, or joined with the channel table received), else 0.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "int (*)(void)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.is_active",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*register_channel)(sco_plugin* self, const char* channel_fqn, uint32_t flags, uint32_t max_len, sco_net_on_message cb, void* ctx);`<br>Registers channel_fqn (\"&lt;this plugin id&gt;.&lt;name&gt;\") with flags (SCO_NET_*) and the largest message this side accepts or sends, max_len (1..SCO_NET_MAX_UNREL, or 1..SCO_NET_MAX_RELIABLE with SCO_NET_RELIABLE); a longer incoming message is dropped before it is reassembled. cb runs on the game thread for each message; ctx is borrowed until unregister_channel or unload. Works with or without a session. SCO_BAD_ARG: a bad name, a name outside this plugin's id, one already registered, bad flags (FROM_HOST with TO_HOST), a bad max_len or a NULL cb. SCO_TOO_MANY: SCO_NET_MAX_CHANNELS already.",
      "callback_context": "callbacks game thread.",
      "cleanup": "Ordinary unregister/unload/non-retained crash cleanup removes the channel; incoming oversized payload dropped before reassembly; no callback cancel token. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-register-channel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*register_channel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "c.r_ = t_->register_channel(self_, name, flags, maxLen, &NetChannel::Thunk, c.fn_.get());"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 48,
      "ownership": "Name copied; cb/ctx borrowed until unregister/unload. Callback buf valid for call only; host registry allocation.",
      "purpose": "Registers channel_fqn (\"&lt;this plugin id&gt;.&lt;name&gt;\") with flags (SCO_NET_*) and the largest message this side accepts or sends, max_len (1..SCO_NET_MAX_UNREL, or 1..SCO_NET_MAX_RELIABLE with SCO_NET_RELIABLE); a longer incoming message is dropped before it is reassembled. cb runs on the game thread for each message; ctx is borrowed until unregister_channel or unload. Works with or without a session. SCO_BAD_ARG: a bad name, a name outside this plugin's id, one already registered, bad flags (FROM_HOST with TO_HOST), a bad max_len or a NULL cb. SCO_TOO_MANY: SCO_NET_MAX_CHANNELS already.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "sco_result (*)(sco_plugin *, const char *, uint32_t, uint32_t, sco_net_on_message, void *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.register_channel",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`uint64_t (*self_peer)(void);`<br>This player's peer id in the active session (the host is 1), 0 when none.",
      "callback_context": "callbacks game thread.",
      "cleanup": "No delivery cancellation API; ordinary unload/non-retained crash cleanup drops channels and queued messages. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-self-peer",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*self_peer)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "uint64_t SelfPeer() const noexcept { return detail::CanCall(t_, &sco_net_v1::self_peer) ? t_->self_peer() : 0; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 64,
      "ownership": "Caller buffers; sends copied, callbacks borrow buf for call only. Host owns channels/messages; no allocation transfer.",
      "purpose": "This player's peer id in the active session (the host is 1), 0 when none.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "uint64_t (*)(void)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.self_peer",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*send_channel)(sco_plugin* self, const char* channel_fqn, const void* buf, uint32_t len);`<br>Queues len bytes on channel_fqn to the other peers (only the host for SCO_NET_TO_HOST). Copies buf; never blocks. SCO_BAD_ARG: a name outside this plugin's id, len over the channel's max_len, buf NULL with len &gt; 0, or the wrong direction (a FROM_HOST channel from a joiner, a TO_HOST channel from the host). SCO_NOT_FOUND: this plugin hasn't registered the channel. SCO_UNAVAILABLE: no active session. SCO_TOO_MANY: over the send quota, or the plugin's outgoing queue is full; dropped. A message no other peer has a channel for is dropped silently.",
      "callback_context": "callbacks game thread.",
      "cleanup": "OK means queued, not delivery acknowledgement. Quota/queue failure drops send; no matching peer channel drops silently; unload drops queued messages. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-net-v1-send-channel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*send_channel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "return t_->send_channel(self_, name_.c_str(), data.data(), static_cast<uint32_t>(data.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 40,
      "ownership": "Caller buffers; sends copied, callbacks borrow buf for call only. Host owns channels/messages; no allocation transfer.",
      "purpose": "Queues len bytes on channel_fqn to the other peers (only the host for SCO_NET_TO_HOST). Copies buf; never blocks. SCO_BAD_ARG: a name outside this plugin's id, len over the channel's max_len, buf NULL with len &gt; 0, or the wrong direction (a FROM_HOST channel from a joiner, a TO_HOST channel from the host). SCO_NOT_FOUND: this plugin hasn't registered the channel. SCO_UNAVAILABLE: no active session. SCO_TOO_MANY: over the send quota, or the plugin's outgoing queue is full; dropped. A message no other peer has a channel for is dropped silently.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "sco_result (*)(sco_plugin *, const char *, const void *, uint32_t)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.send_channel",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*unregister_channel)(sco_plugin* self, const char* channel_fqn);`<br>Removes one of this plugin's channels: no callback runs for it after this returns (on the game thread; from another thread, one already running may finish). SCO_NOT_FOUND: not registered by this plugin.",
      "callback_context": "callbacks game thread.",
      "cleanup": "On game thread no later callback; off-thread callback already running may finish. Further transport timing unspecified.",
      "examples": [],
      "id": "sco-net-v1-unregister-channel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_net.h",
              "token": "(*unregister_channel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_net.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/net.hpp",
              "token": "if (detail::CanCall(t_, &sco_net_v1::unregister_channel)) t_->unregister_channel(self_, name_.c_str());"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_net.c",
            "tests/test_net_service.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/sdk-csharp.md",
              "token": "There are no C# wrappers for `sco.ipc` and `sco.net` yet"
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/net.md",
              "token": "The C# (`Sco.Sdk`) and Lua layers come in a follow-up"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "Further transport timing unspecified."
      ],
      "member_extent": 56,
      "ownership": "Host drops owned channel; caller ctx can be freed on game thread after return; off-thread an already running callback may finish.",
      "purpose": "Removes one of this plugin's channels: no callback runs for it after this returns (on the game thread; from another thread, one already running may finish). SCO_NOT_FOUND: not registered by this plugin.",
      "reentrancy": "Callbacks may call any method in this table.",
      "results": "Absent table: query_service NOT_FOUND. Stopped result methods: UNAVAILABLE; self-taking methods reject invalid/released self with BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.net",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_net.h",
      "symbol": "sco_net_v1.unregister_channel",
      "table": "sco_net_v1",
      "table_size": 64,
      "tests": [
        "tests/abi_net.c",
        "tests/test_net_service.cpp",
        "tools/test.sh"
      ],
      "thread_affinity": "Any thread; callbacks game thread. Callbacks may call any method in this table.",
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    {
      "absent_capability": "Missing required capabilities handled by discovery; load-specific absence policy belongs to plugin",
      "buffer_contract": "`sco_result sco_plugin_load(const sco_api* api, sco_plugin* self)`",
      "callback_context": "unspecified",
      "cleanup": "Ordinary failed-load/non-retained crash cleanup removes registrations, queued work and owned resources. If a nested consumer obtained the provider table during load, a failed load is refused with backing state retained: no owner release, resource hooks, export clearing or module closure. Exposed-provider faults instead become terminal faulted with retained state and restart required. Do not rely on unload after a failed load.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-plugin-load",
      "kind": "entrypoint",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "sco_plugin_load(const sco_api* api, sco_plugin* self)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "extern \"C\" SCO_EXPORT sco_result sco_plugin_load(const sco_api* api, sco_plugin* self)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_plugins.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "[UnmanagedCallersOnly(EntryPoint = \"sco_plugin_load\")]"
            },
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "PluginExports.Load<Hello>("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "A Lua plugin is a folder with `plugin.ini` (`kind = lua`, `entry = main.lua`)"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "internal allocation unspecified",
        "recursive load reentrancy unspecified"
      ],
      "member_extent": null,
      "ownership": "Borrowed host API and opaque self valid until unload; plugin owns its private state/allocations; internal allocation unspecified",
      "purpose": "`sco_result sco_plugin_load(const sco_api* api, sco_plugin* self)`",
      "reentrancy": "unspecified",
      "results": "OK stays loaded; any other return rejects load; guarded fault disables plugin. Missing required capabilities handled by discovery; load-specific absence policy belongs to plugin",
      "service": "native-plugin",
      "signature": "sco_result (const sco_api *, sco_plugin *)",
      "since": "API 1.0; received API fields gated by size",
      "source_header": "include/sco_api.h",
      "symbol": "sco_plugin_load",
      "table": null,
      "table_size": null,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_plugins.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Game thread per API reference; recursive load reentrancy unspecified",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`const sco_plugin_info* sco_plugin_query(void)`; info.size set to sizeof, name/version/author UTF-8 NUL strings",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; query does not register a cleanup notification",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-plugin-query",
      "kind": "entrypoint",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "sco_plugin_query(void)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "extern \"C\" SCO_EXPORT const sco_plugin_info* sco_plugin_query(void)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_plugins.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "[UnmanagedCallersOnly(EntryPoint = \"sco_plugin_query\")]"
            },
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "PluginExports.Query("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "A Lua plugin is a folder with `plugin.ini` (`kind = lua`, `entry = main.lua`)"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Query-thread identity unspecified;",
        "recursive reentrancy unspecified"
      ],
      "member_extent": null,
      "ownership": "Plugin-owned static info/string storage valid until DLL unload; host copies checked metadata. Never free from host",
      "purpose": "`const sco_plugin_info* sco_plugin_query(void)`; info.size set to sizeof, name/version/author UTF-8 NUL strings",
      "reentrancy": "unspecified",
      "results": "NULL info, undersized info, major mismatch, newer minor, mismatched plugin id or guarded fault refuses load; no capability gate",
      "service": "native-plugin",
      "signature": "const sco_plugin_info *(void)",
      "since": "API 1.0; returned info must cover 32-byte `sco_plugin_info`",
      "source_header": "include/sco_api.h",
      "symbol": "sco_plugin_query",
      "table": null,
      "table_size": null,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_plugins.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Query-thread identity unspecified; recursive reentrancy unspecified",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`void sco_plugin_unload(void)`; final normal lifecycle call for that instance",
      "callback_context": "unspecified",
      "cleanup": "Terminal shutdown or permitted reload; crashed/failed-load instances need not receive it. Live-session unload/reload of a provider whose table was handed out is refused. Retained-provider faults skip unload/resource hooks and require restart; mapped code does not make cached calls safe.",
      "examples": [
        "sdk/examples/hello/hello.c",
        "sdk/examples/cpp_hello/cpp_hello.cpp",
        "sdk/examples/cs_hello/CsHello.cs"
      ],
      "id": "sco-plugin-unload",
      "kind": "entrypoint",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_api.h",
              "token": "sco_plugin_unload(void)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_v1.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/plugin.hpp",
              "token": "extern \"C\" SCO_EXPORT void sco_plugin_unload(void)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_v1.c",
            "tests/test_plugins.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "[UnmanagedCallersOnly(EntryPoint = \"sco_plugin_unload\")]"
            },
            {
              "path": "sdk/examples/cs_hello/CsHello.cs",
              "token": "PluginExports.Unload("
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "sdk/docs/lua.md",
              "token": "A Lua plugin is a folder with `plugin.ini` (`kind = lua`, `entry = main.lua`)"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "an independent export thread guarantee and recursive reentrancy are unspecified",
        "Capability availability during teardown unspecified"
      ],
      "member_extent": null,
      "ownership": "Plugin frees its own state and stops its workers; host owns API/self/registries; borrowed external pointers must not be freed",
      "purpose": "`void sco_plugin_unload(void)`; final normal lifecycle call for that instance",
      "reentrancy": "unspecified",
      "results": "void, no error result; loader guards faults. Capability availability during teardown unspecified",
      "service": "native-plugin",
      "signature": "void (void)",
      "since": "API 1.0; no sized parameter",
      "source_header": "include/sco_api.h",
      "symbol": "sco_plugin_unload",
      "table": null,
      "table_size": null,
      "tests": [
        "tests/abi_v1.c",
        "tests/test_plugins.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Normal host lifecycle uses game-thread release; an independent export thread guarantee and recursive reentrancy are unspecified",
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*get_bool)(sco_plugin* self, const char* name, int32_t* out);`<br>out = 0 or 1. SCO_BAD_ARG: not a bool setting, a NULL name or out, or a bad self.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous reads; unload withdraws settings. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-settings-v1-get-bool",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_settings.h",
              "token": "(*get_bool)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_settings.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/settings.hpp",
              "token": "const sco_result r = t_->get_bool(self_, name, &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_settings.c",
            "tests/test_settings.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Settings.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) r = _t->get_bool(Self, n, &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if ((r = st->get_bool(s->self, name, &b)) == SCO_OK) { lua_pushboolean(L, b); return 1; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 16,
      "ownership": "Caller outputs; host owns settings; no allocation transfer. String/error copy may allocate internally.",
      "purpose": "out = 0 or 1. SCO_BAD_ARG: not a bool setting, a NULL name or out, or a bad self.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown setting: NOT_FOUND; wrong type: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.settings",
      "signature": "sco_result (*)(sco_plugin *, const char *, int32_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_settings.h",
      "symbol": "sco_settings_v1.get_bool",
      "table": "sco_settings_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_settings.c",
        "tests/test_settings.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; memory reads under lock. Recursive reentrancy unspecified.",
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*get_float)(sco_plugin* self, const char* name, double* out);`<br>SCO_BAD_ARG: not a float setting.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous reads; unload withdraws settings. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-settings-v1-get-float",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_settings.h",
              "token": "(*get_float)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_settings.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/settings.hpp",
              "token": "return detail::CanCall(t_, &sco_settings_v1::get_float) ? t_->get_float(self_, name, &out) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_settings.c",
            "tests/test_settings.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Settings.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) r = _t->get_float(Self, n, &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (r == SCO_BAD_ARG && (r = st->get_float(s->self, name, &f)) == SCO_OK) { lua_pushnumber(L, (lua_Number)f); return 1; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Caller outputs; host owns settings; no allocation transfer. String/error copy may allocate internally.",
      "purpose": "SCO_BAD_ARG: not a float setting.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown setting: NOT_FOUND; wrong type: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.settings",
      "signature": "sco_result (*)(sco_plugin *, const char *, double *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_settings.h",
      "symbol": "sco_settings_v1.get_float",
      "table": "sco_settings_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_settings.c",
        "tests/test_settings.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; memory reads under lock. Recursive reentrancy unspecified.",
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*get_int)(sco_plugin* self, const char* name, int64_t* out);`<br>SCO_BAD_ARG: not an int setting (a float or enum included).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous reads; unload withdraws settings. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-settings-v1-get-int",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_settings.h",
              "token": "(*get_int)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_settings.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/settings.hpp",
              "token": "return detail::CanCall(t_, &sco_settings_v1::get_int) ? t_->get_int(self_, name, &out) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_settings.c",
            "tests/test_settings.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Settings.cs",
              "token": "fixed (byte* n = Utf8.Z(name)) r = _t->get_int(Self, n, &v);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (r == SCO_BAD_ARG && (r = st->get_int(s->self, name, &i)) == SCO_OK) { lua_pushinteger(L, (lua_Integer)i); return 1; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Caller outputs; host owns settings; no allocation transfer. String/error copy may allocate internally.",
      "purpose": "SCO_BAD_ARG: not an int setting (a float or enum included).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped: UNAVAILABLE; invalid/released self: BAD_ARG; unknown setting: NOT_FOUND; wrong type: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.settings",
      "signature": "sco_result (*)(sco_plugin *, const char *, int64_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_settings.h",
      "symbol": "sco_settings_v1.get_int",
      "table": "sco_settings_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_settings.c",
        "tests/test_settings.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; memory reads under lock. Recursive reentrancy unspecified.",
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*get_string)(sco_plugin* self, const char* name, char* out, uint32_t* inout_size);`<br>A string setting's text, or an enum setting's choice, with the size handshake.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous reads; unload withdraws settings. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-settings-v1-get-string",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_settings.h",
              "token": "(*get_string)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_settings.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/settings.hpp",
              "token": "const sco_result r = t_->get_string(self_, name, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_settings.c",
            "tests/test_settings.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Settings.cs",
              "token": "ScoResult r = Storage.Sized((buf, size) => { fixed (byte* np = n) return _t->get_string(Self, np, buf, size); }, out byte[] b);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (r == SCO_BAD_ARG && (r = st->get_string(s->self, name, buf, &size)) == SCO_OK) { lua_pushlstring(L, buf, size - 1); return 1; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified."
      ],
      "member_extent": 40,
      "ownership": "Caller outputs; host owns settings; no allocation transfer. String/error copy may allocate internally.",
      "purpose": "A string setting's text, or an enum setting's choice, with the size handshake.",
      "reentrancy": "unspecified",
      "results": "Common settings errors; TOO_MANY reports required NUL-inclusive bytes without writing string; inout_size reset on other failure. Caller text untouched on failure.",
      "service": "sco.settings",
      "signature": "sco_result (*)(sco_plugin *, const char *, char *, uint32_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_settings.h",
      "symbol": "sco_settings_v1.get_string",
      "table": "sco_settings_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_settings.c",
        "tests/test_settings.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; memory reads under lock. Recursive reentrancy unspecified.",
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The message of this plugin's last failed call (\"\" if none), NUL-terminated, with the size handshake.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; synchronous reads; unload withdraws settings. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [],
      "id": "sco-settings-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_settings.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_settings.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/settings.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_settings.c",
            "tests/test_settings.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Settings.cs",
              "token": "return Storage.Sized((buf, size) => _t->last_error(Self, buf, size), out byte[] b) == ScoResult.Ok ? Utf8.FromBytes(b) : \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "st->last_error(s->self, msg, &size)"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "static int L_settings_get(lua_State* L)"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Recursive reentrancy unspecified.",
        "diagnostic completeness unspecified."
      ],
      "member_extent": 48,
      "ownership": "Caller outputs; host owns settings; no allocation transfer. String/error copy may allocate internally.",
      "purpose": "The message of this plugin's last failed call (\"\" if none), NUL-terminated, with the size handshake.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid/released self or buffer; UNAVAILABLE stopped; TOO_MANY required bytes or allocation. Empty string if no recorded failure; diagnostic completeness unspecified.",
      "service": "sco.settings",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_settings.h",
      "symbol": "sco_settings_v1.last_error",
      "table": "sco_settings_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_settings.c",
        "tests/test_settings.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; memory reads under lock. Recursive reentrancy unspecified.",
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*begin)(sco_plugin* self);`<br>SCO_BAD_ARG: one is already open. Until commit nothing the plugin writes is durable; ordinary unload, non-retained crash cleanup or rollback undoes all of it. Retained-provider faults skip rollback/close hooks and require restart.",
      "callback_context": "unspecified",
      "cleanup": "rollback or ordinary unload/non-retained crash cleanup undoes uncommitted writes; no per-call interrupt API. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-begin",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*begin)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result Begin() noexcept { return detail::CanCall(t_, &sco_storage_v1::begin) && detail::CanCall(t_, &sco_storage_v1::rollback) ? t_->begin(self_) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "public ScoResult Begin() => _t == null || _t->size < (uint)((byte*)&_t->rollback - (byte*)_t + sizeof(nint)) || _t->begin == null || _t->rollback == null ? ScoResult.Unavailable : _t->begin(Self);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "StoreTx(L, st ? st->begin : NULL, st, s)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 48,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "SCO_BAD_ARG: one is already open. Until commit nothing the plugin writes is durable; ordinary unload, non-retained crash cleanup or rollback undoes all of it. Retained-provider faults skip rollback/close hooks and require restart.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.begin",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*close)(sco_plugin* self, uint64_t cursor);`<br>Closes a cursor. SCO_NOT_FOUND: this plugin holds no cursor by that id.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-close",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*close)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "if (detail::CanCall(t_, &sco_storage_v1::close)) t_->close(self_, id_);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "if (_id != 0 && _s.Table != null && _s.Table->size >= (uint)((byte*)&_s.Table->close - (byte*)_s.Table + sizeof(nint)) && _s.Table->close != null) _s.Table->close(_s.SelfFor, _id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (st) st->close(Of(L)->self, c->id);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 120,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Closes a cursor. SCO_NOT_FOUND: this plugin holds no cursor by that id.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 120`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.close",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*column)(sco_plugin* self, uint64_t cursor, uint32_t index, sco_sql_value* out, void* buf, uint32_t* inout_size);`<br>Column index of the current row. out gets the type and value; TEXT and BLOB bytes go to buf with the size handshake (TEXT NUL-terminated; inout_size NULL: no bytes wanted). SCO_BAD_ARG: no current row, or index out of range.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-column",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*column)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "if (detail::CanCall(t_, &sco_storage_v1::column)) t_->column(self_, id_, index, &v, nullptr, nullptr);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "ScoResult r = _id == 0 ? ScoResult.NotFound : !(_s.Table != null && _s.Table->size >= (uint)((byte*)&_s.Table->column - (byte*)_s.Table + sizeof(nint)) && _s.Table->column != null) ? ScoResult.Unavailable : _s.Table->column(_s.SelfFor, _id, (uint)i, &value, null, null);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "sco_result r = st->column(s->self, cur, i, &v, NULL, NULL);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 104,
      "ownership": "Caller owns descriptor and byte buffer. TEXT/BLOB descriptor v.p is NULL; numeric values copied. Host may allocate staging text.",
      "purpose": "Column index of the current row. out gets the type and value; TEXT and BLOB bytes go to buf with the size handshake (TEXT NUL-terminated; inout_size NULL: no bytes wanted). SCO_BAD_ARG: no current row, or index out of range.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t, sco_sql_value *, void *, uint32_t *)",
      "since": "`size >= 104`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.column",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*column_count)(sco_plugin* self, uint64_t cursor, uint32_t* out_count);`<br>Returns number of columns of a held cursor into required uint32_t out_count; no current row needed; output initialized to 0.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-column-count",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*column_count)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "if (detail::CanCall(t_, &sco_storage_v1::column_count)) t_->column_count(self_, id_, &n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return _id != 0 && _s.Table != null && _s.Table->size >= (uint)((byte*)&_s.Table->column_count - (byte*)_s.Table + sizeof(nint)) && _s.Table->column_count != null && _s.Table->column_count(_s.SelfFor, _id, &n) == ScoResult.Ok ? (int)n : 0;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "r = st->column_count(s->self, c->id, &ncols);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified."
      ],
      "member_extent": 96,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Returns number of columns of a held cursor into required uint32_t out_count; no current row needed; output initialized to 0.",
      "reentrancy": "unspecified",
      "results": "Common storage failures; BAD_ARG NULL output; NOT_FOUND unknown/non-owned cursor; *out_count initialized to 0.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t *)",
      "since": "`size >= 96`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.column_count",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*column_name)(sco_plugin* self, uint64_t cursor, uint32_t index, char* out, uint32_t* inout_size);`<br>The column's name, NUL-terminated, with the size handshake.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-column-name",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*column_name)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*column_name)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return Storage.Sized((buf, size) => _s.Table->column_name(_s.SelfFor, _id, (uint)i, buf, size), out byte[] b) == ScoResult.Ok"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "r = st->column_name(s->self, c->id, i, name, &size);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified."
      ],
      "member_extent": 112,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "The column's name, NUL-terminated, with the size handshake.",
      "reentrancy": "unspecified",
      "results": "Common storage failures; NOT_FOUND unknown/non-owned cursor; BAD_ARG invalid buffer/index; TOO_MANY required bytes. Does not require a current row.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, uint64_t, uint32_t, char *, uint32_t *)",
      "since": "`size >= 112`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.column_name",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*commit)(sco_plugin* self);`<br>Makes everything since begin durable. SCO_BAD_ARG: none open.",
      "callback_context": "unspecified",
      "cleanup": "Synchronous; no cancellation API; successful commit durable and not undone by unload. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-commit",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*commit)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result Commit() noexcept { return detail::CanCall(t_, &sco_storage_v1::commit) ? t_->commit(self_) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "public ScoResult Commit() => _t == null || _t->size < (uint)((byte*)&_t->commit - (byte*)_t + sizeof(nint)) || _t->commit == null ? ScoResult.Unavailable : _t->commit(Self);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "StoreTx(L, st ? st->commit : NULL, st, s)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 56,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Makes everything since begin durable. SCO_BAD_ARG: none open.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.commit",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*del)(sco_plugin* self, const char* key);`<br>Removes a key. SCO_NOT_FOUND: there was none.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-del",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*del)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result Delete(const char* key) noexcept { return detail::CanCall(t_, &sco_storage_v1::del) ? t_->del(self_, key) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "fixed (byte* k = Utf8.Z(key)) return _t->del(Self, k);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = st->del(s->self, key);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Removes a key. SCO_NOT_FOUND: there was none.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.del",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*exec)(sco_plugin* self, const char* sql, const sco_sql_value* params, uint32_t nparams, int64_t* out_changes);`<br>Runs one statement with nparams bound parameters (?, ?NNN, :name in index order; nparams must equal the statement's count; params may be NULL with 0). Rows it returns are dropped. out_changes (optional): rows changed. SCO_BAD_ARG: not exactly one statement, a syntax error, a wrong parameter count, or something storage refuses (ATTACH, DETACH, BEGIN, COMMIT, SAVEPOINT, VACUUM, a PRAGMA outside the list in docs/storage.md, schema changes to a table or index named sco_*). SCO_FAILED: it ran and failed (a constraint, its time budget, the database busy); last_error says why. SCO_TOO_MANY: the quota is full.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-exec",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*exec)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "return t_->exec(self_, sql, params.size() ? params.begin() : nullptr, static_cast<uint32_t>(params.size()), changes);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "r = _t->exec(Self, s, block.Values, block.Count, &c);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = st->exec(s->self, sql, n ? params : NULL, n, &changes);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 72,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Runs one statement with nparams bound parameters (?, ?NNN, :name in index order; nparams must equal the statement's count; params may be NULL with 0). Rows it returns are dropped. out_changes (optional): rows changed. SCO_BAD_ARG: not exactly one statement, a syntax error, a wrong parameter count, or something storage refuses (ATTACH, DETACH, BEGIN, COMMIT, SAVEPOINT, VACUUM, a PRAGMA outside the list in docs/storage.md, schema changes to a table or index named sco_*). SCO_FAILED: it ran and failed (a constraint, its time budget, the database busy); last_error says why. SCO_TOO_MANY: the quota is full.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *, const sco_sql_value *, uint32_t, int64_t *)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.exec",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*get)(sco_plugin* self, const char* key, void* out, uint32_t* inout_size);`<br>Reads a value with the size handshake. SCO_NOT_FOUND: no such key (*inout_size 0).",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-get",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*get)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "const sco_result r = t_->get(self_, key, size ? out.data() : nullptr, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return Sized((buf, size) => { fixed (byte* kp = k) return _t->get(Self, kp, buf, size); }, out value);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "sco_result r = st->get(s->self, key, NULL, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Reads a value with the size handshake. SCO_NOT_FOUND: no such key (*inout_size 0).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *, void *, uint32_t *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.get",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The message of this plugin's last failed call (\"\" if none), NUL-terminated, with the size handshake.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return Sized((buf, size) => _t->last_error(Self, buf, size), out byte[] b) == ScoResult.Ok ? Utf8.FromBytes(b) : \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "st->last_error(s->self, msg, &size)"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 128,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "The message of this plugin's last failed call (\"\" if none), NUL-terminated, with the size handshake.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 128`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.last_error",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*next_key)(sco_plugin* self, const char* prefix, const char* after, char* out, uint32_t* inout_size);`<br>The first key that starts with prefix (NULL or \"\": any key) and sorts after \"after\" (NULL: from the start), in byte order, copied NUL-terminated with the size handshake. Iterate by passing the last key back as after. SCO_NOT_FOUND: no more keys.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-next-key",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*next_key)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "const sco_result r = t_->next_key(self_, prefix, out.empty() ? nullptr : last.c_str(), buf, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return _t->next_key(Self, pp, ap, buf, size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = st->next_key(s->self, prefix, after, key, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 40,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "The first key that starts with prefix (NULL or \"\": any key) and sorts after \"after\" (NULL: from the start), in byte order, copied NUL-terminated with the size handshake. Iterate by passing the last key back as after. SCO_NOT_FOUND: no more keys.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *, char *, uint32_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.next_key",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*put)(sco_plugin* self, const char* key, const void* value, uint32_t value_size);`<br>Writes value (value_size bytes; value may be NULL with 0), replacing any old one. Durable when it returns, unless a transaction is open. SCO_TOO_MANY: the plugin's quota is full.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-put",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*put)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "return t_->put(self_, key, value.data(), static_cast<uint32_t>(value.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "return _t->put(Self, k, v, (uint)value.Length);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = st->put(s->self, key, value, (uint32_t)n);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 16,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Writes value (value_size bytes; value may be NULL with 0), replacing any old one. Durable when it returns, unless a transaction is open. SCO_TOO_MANY: the plugin's quota is full.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *, const void *, uint32_t)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.put",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*query)(sco_plugin* self, const char* sql, const sco_sql_value* params, uint32_t nparams, uint64_t* out_cursor);`<br>Prepares one statement as exec does and opens a cursor before its first row. Close it when done. SCO_TOO_MANY: SCO_STORAGE_MAX_CURSORS already open. out_cursor initialized to 0 before validation; caller must close cursor even after end-of-rows.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-query",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*query)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "c.r_ = t_->query(self_, sql, params.size() ? params.begin() : nullptr, static_cast<uint32_t>(params.size()), &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "r = _t->query(Self, s, block.Values, block.Count, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "sco_result r = st->query(s->self, sql, n ? params : NULL, n, &c->id);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 80,
      "ownership": "Host-owned cursor ID; close when done. SQL/parameters copied during call, TEXT needs no NUL; no SQLite memory crosses ABI.",
      "purpose": "Prepares one statement as exec does and opens a cursor before its first row. Close it when done. SCO_TOO_MANY: SCO_STORAGE_MAX_CURSORS already open. out_cursor initialized to 0 before validation; caller must close cursor even after end-of-rows.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, const char *, const sco_sql_value *, uint32_t, uint64_t *)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.query",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*rollback)(sco_plugin* self);`<br>Undoes everything since begin. SCO_BAD_ARG: none open.",
      "callback_context": "unspecified",
      "cleanup": "Synchronous rollback, not a request to interrupt another thread's running statement.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-rollback",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*rollback)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result Rollback() noexcept { return detail::CanCall(t_, &sco_storage_v1::rollback) ? t_->rollback(self_) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "public ScoResult Rollback() => _t == null || _t->size < (uint)((byte*)&_t->rollback - (byte*)_t + sizeof(nint)) || _t->rollback == null ? ScoResult.Unavailable : _t->rollback(Self);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "StoreTx(L, st ? st->rollback : NULL, st, s)"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 64,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Undoes everything since begin. SCO_BAD_ARG: none open.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.rollback",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND.",
      "buffer_contract": "`sco_result (*step)(sco_plugin* self, uint64_t cursor);`<br>Moves to the next row. SCO_OK: a row is ready. SCO_NOT_FOUND: no more rows, or an id this plugin doesn't hold. SCO_FAILED / SCO_TOO_MANY: as for exec.",
      "callback_context": "unspecified",
      "cleanup": "No cancellation entrypoint; ordinary unload/non-retained crash cleanup rolls back transaction and closes cursors/database. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls.",
      "examples": [
        "sdk/examples/notebook/main.lua"
      ],
      "id": "sco-storage-v1-step",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_storage.h",
              "token": "(*step)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_storage.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/storage.hpp",
              "token": "sco_result Next() noexcept { return detail::CanCall(t_, &sco_storage_v1::step) ? t_->step(self_, id_) : (t_ ? SCO_UNAVAILABLE : r_); }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_storage.c",
            "tests/test_settings.cpp",
            "tests/test_storage.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Storage.cs",
              "token": "public ScoResult Next() => _id == 0 ? ScoResult.NotFound : !(_s.Table != null && _s.Table->size >= (uint)((byte*)&_s.Table->step - (byte*)_s.Table + sizeof(nint)) && _s.Table->step != null) ? ScoResult.Unavailable : _s.Table->step(_s.SelfFor, _id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "r = st->step(s->self, c->id);"
            },
            {
              "path": "sdk/docs/lua.md",
              "token": "**Cursors** are the runtime's: `sql` closes its cursor on every path"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Same-call recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 88,
      "ownership": "Caller buffers; inputs/SQL parameters copied during call. Host owns database/cursors; no SQLite pointer or allocation crosses the ABI.",
      "purpose": "Moves to the next row. SCO_OK: a row is ready. SCO_NOT_FOUND: no more rows, or an id this plugin doesn't hold. SCO_FAILED / SCO_TOO_MANY: as for exec.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND. Stopped: UNAVAILABLE; invalid/released self: BAD_ARG. Allocation exceptions: TOO_MANY; database errors may be FAILED. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.storage",
      "signature": "sco_result (*)(sco_plugin *, uint64_t)",
      "since": "`size >= 88`; 1.0",
      "source_header": "include/sco_storage.h",
      "symbol": "sco_storage_v1.step",
      "table": "sco_storage_v1",
      "table_size": 128,
      "tests": [
        "tests/abi_storage.c",
        "tests/test_lua.cpp",
        "tests/test_settings.cpp",
        "tests/test_storage.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; calls serialize per plugin. Same-call recursive reentrancy unspecified.",
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    {
      "absent_capability": "query_service NOT_FOUND when the host does not publish sco.ui.surfaces (it needs sco.ui started); UNAVAILABLE for an incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The message of this plugin's last refused call (\"\" if none), NUL-terminated, with the raw-handler size handshake (*inout_size: capacity in; bytes written, or needed with TOO_MANY, out).",
      "callback_context": "No callbacks; desc, pose and panel_id are read during the call only.",
      "cleanup": "No cancellation entrypoint; synchronous read. Unload and Stop clear the message.",
      "examples": [],
      "id": "sco-ui-surfaces-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui_surfaces.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui_surfaces.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui_surfaces.hpp",
              "token": "sco_result r = table_->last_error(self_, out.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_surfaces.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Headless host tests only: no renderer projects or draws surfaces in sco-core, and nothing has run in a game.",
        "The panel shown is a sco.widgets panel id; the host checks its form and ownership, not that the panel exists.",
        "C# and Lua bindings are unsupported in 1.0."
      ],
      "member_extent": 40,
      "ownership": "Caller-owned buffer written in place. No allocation transfer.",
      "purpose": "The message of this plugin's last refused call (\"\" if none), NUL-terminated, with the raw-handler size handshake (*inout_size: capacity in; bytes written, or needed with TOO_MANY, out).",
      "reentrancy": "No plugin code runs inside the service; calls from several threads are serialized by the registry lock.",
      "results": "OK; TOO_MANY buffer too small (*inout_size = bytes needed); BAD_ARG invalid/released self, NULL inout_size or NULL out with nonzero capacity; UNAVAILABLE stopped service. Diagnostic completeness unspecified.",
      "service": "sco.ui.surfaces",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_ui_surfaces.h",
      "symbol": "sco_ui_surfaces_v1.last_error",
      "table": "sco_ui_surfaces_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_ui_surfaces.c",
        "tests/test_surfaces.cpp"
      ],
      "thread_affinity": "Any thread; registry lock held only for the copy. No callbacks.",
      "version_macro": "SCO_UI_SURFACES_VERSION_1_0"
    },
    {
      "absent_capability": "query_service NOT_FOUND when the host does not publish sco.ui.surfaces (it needs sco.ui started); UNAVAILABLE for an incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*register_surface)(sco_plugin* self, const sco_surface_desc* desc, uint32_t* out_id);`<br>Adds a HUD_2D, BILLBOARD_3D or QUAD_3D surface showing one of the caller's sco.widgets panels and writes its nonzero, never-reused id. desc and pose sizes must cover the 1.0 structs (larger tails ignored); every double finite; per-kind rules: HUD centre and size in viewport fractions with zero normal/up, billboard zero normal and unit up, quad unit normal and unit up perpendicular within 1e-3; 3D extents (0, 1000] m, max_distance [0, 1e7] m (0 = no limit), coordinates within 1e12 m; flags 0 or OCCLUDE_RAYCAST (3D only); panel_id \"<plugin id>.<name>\" at most 63 bytes. 32 surfaces per plugin, 256 in all. Failure leaves the registry and *out_id unchanged.",
      "callback_context": "No callbacks; desc, pose and panel_id are read during the call only.",
      "cleanup": "No cancellation entrypoint; synchronous. Unregister, plugin unload or crash (through the sco.ui release hook) and service Stop withdraw the surface.",
      "examples": [],
      "id": "sco-ui-surfaces-v1-register-surface",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui_surfaces.h",
              "token": "(*register_surface)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui_surfaces.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui_surfaces.hpp",
              "token": "return table_->register_surface(self_, &desc, &id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_surfaces.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Headless host tests only: no renderer projects or draws surfaces in sco-core, and nothing has run in a game.",
        "The panel shown is a sco.widgets panel id; the host checks its form and ownership, not that the panel exists.",
        "C# and Lua bindings are unsupported in 1.0."
      ],
      "member_extent": 16,
      "ownership": "Host copies the pose and panel_id on success; caller keeps desc, pose and the string. No allocation transfer.",
      "purpose": "Adds a HUD_2D, BILLBOARD_3D or QUAD_3D surface showing one of the caller's sco.widgets panels and writes its nonzero, never-reused id. desc and pose sizes must cover the 1.0 structs (larger tails ignored); every double finite; per-kind rules: HUD centre and size in viewport fractions with zero normal/up, billboard zero normal and unit up, quad unit normal and unit up perpendicular within 1e-3; 3D extents (0, 1000] m, max_distance [0, 1e7] m (0 = no limit), coordinates within 1e12 m; flags 0 or OCCLUDE_RAYCAST (3D only); panel_id \"<plugin id>.<name>\" at most 63 bytes. 32 surfaces per plugin, 256 in all. Failure leaves the registry and *out_id unchanged.",
      "reentrancy": "No plugin code runs inside the service; calls from several threads are serialized by the registry lock.",
      "results": "OK; BAD_ARG invalid/released self, NULL or short desc/pose, unknown kind, any field outside the rules, NULL out_id; TOO_MANY per-plugin or host limit, id space exhausted or allocation failure; UNAVAILABLE stopped service. last_error names the refused field.",
      "service": "sco.ui.surfaces",
      "signature": "sco_result (*)(sco_plugin *, const sco_surface_desc *, uint32_t *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_ui_surfaces.h",
      "symbol": "sco_ui_surfaces_v1.register_surface",
      "table": "sco_ui_surfaces_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_ui_surfaces.c",
        "tests/test_surfaces.cpp"
      ],
      "thread_affinity": "Any thread; registry lock held only for the copy. No callbacks.",
      "version_macro": "SCO_UI_SURFACES_VERSION_1_0"
    },
    {
      "absent_capability": "query_service NOT_FOUND when the host does not publish sco.ui.surfaces (it needs sco.ui started); UNAVAILABLE for an incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*unregister_surface)(sco_plugin* self, uint32_t id);`<br>Removes one of the caller's surfaces. Its id is not reused.",
      "callback_context": "No callbacks; desc, pose and panel_id are read during the call only.",
      "cleanup": "No cancellation entrypoint; synchronous and final.",
      "examples": [],
      "id": "sco-ui-surfaces-v1-unregister-surface",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui_surfaces.h",
              "token": "(*unregister_surface)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui_surfaces.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui_surfaces.hpp",
              "token": "return table_->unregister_surface(self_, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_surfaces.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Headless host tests only: no renderer projects or draws surfaces in sco-core, and nothing has run in a game.",
        "The panel shown is a sco.widgets panel id; the host checks its form and ownership, not that the panel exists.",
        "C# and Lua bindings are unsupported in 1.0."
      ],
      "member_extent": 32,
      "ownership": "Host releases its copy; nothing of the caller is retained. No allocation transfer.",
      "purpose": "Removes one of the caller's surfaces. Its id is not reused.",
      "reentrancy": "No plugin code runs inside the service; calls from several threads are serialized by the registry lock.",
      "results": "OK; NOT_FOUND no surface of this plugin by that id; BAD_ARG invalid/released self; UNAVAILABLE stopped service.",
      "service": "sco.ui.surfaces",
      "signature": "sco_result (*)(sco_plugin *, uint32_t)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_ui_surfaces.h",
      "symbol": "sco_ui_surfaces_v1.unregister_surface",
      "table": "sco_ui_surfaces_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_ui_surfaces.c",
        "tests/test_surfaces.cpp"
      ],
      "thread_affinity": "Any thread; registry lock held only for the copy. No callbacks.",
      "version_macro": "SCO_UI_SURFACES_VERSION_1_0"
    },
    {
      "absent_capability": "query_service NOT_FOUND when the host does not publish sco.ui.surfaces (it needs sco.ui started); UNAVAILABLE for an incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*update_surface_pose)(sco_plugin* self, uint32_t id, const sco_surface_pose* pose);`<br>Replaces the pose and panel of one of the caller's surfaces, checked against the kind it was registered with (the register_surface rules). Failure leaves the old pose.",
      "callback_context": "No callbacks; desc, pose and panel_id are read during the call only.",
      "cleanup": "No cancellation entrypoint; synchronous. The surface keeps its id and kind; unload, crash and Stop withdraw it.",
      "examples": [],
      "id": "sco-ui-surfaces-v1-update-surface-pose",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui_surfaces.h",
              "token": "(*update_surface_pose)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui_surfaces.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui_surfaces.hpp",
              "token": "return table_->update_surface_pose(self_, id, &pose);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_surfaces.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.ui.surfaces routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Headless host tests only: no renderer projects or draws surfaces in sco-core, and nothing has run in a game.",
        "The panel shown is a sco.widgets panel id; the host checks its form and ownership, not that the panel exists.",
        "C# and Lua bindings are unsupported in 1.0."
      ],
      "member_extent": 24,
      "ownership": "Host copies the pose and panel_id on success; caller keeps pose and the string. No allocation transfer.",
      "purpose": "Replaces the pose and panel of one of the caller's surfaces, checked against the kind it was registered with (the register_surface rules). Failure leaves the old pose.",
      "reentrancy": "No plugin code runs inside the service; calls from several threads are serialized by the registry lock.",
      "results": "OK; NOT_FOUND no surface of this plugin by that id; BAD_ARG invalid/released self, NULL or short pose, any field outside the rules for the kind; TOO_MANY allocation failure; UNAVAILABLE stopped service.",
      "service": "sco.ui.surfaces",
      "signature": "sco_result (*)(sco_plugin *, uint32_t, const sco_surface_pose *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_ui_surfaces.h",
      "symbol": "sco_ui_surfaces_v1.update_surface_pose",
      "table": "sco_ui_surfaces_v1",
      "table_size": 40,
      "tests": [
        "tests/abi_ui_surfaces.c",
        "tests/test_surfaces.cpp"
      ],
      "thread_affinity": "Any thread; registry lock held only for the copy. No callbacks.",
      "version_macro": "SCO_UI_SURFACES_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*bind_hotkey)(sco_plugin* self, const char* chord, const char* command, const sco_arg* args, uint32_t nargs);`<br>Binds chord to the command name (\"&lt;x&gt;.&lt;y&gt;\"; any plugin's or a host feature's) with nargs arguments (args may be NULL with 0), which are copied, strings included. When the product sees the chord it invokes the command through the command registry, as invoke would, with this plugin as the caller; the command needn't exist yet. SCO_BAD_ARG: a bad chord or command name, a bad argument, or the chord taken: bound already (by anyone, this plugin included) or reserved by the product; last_error names the owner. SCO_TOO_MANY: the host's hotkey table is full.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "unbind_hotkey/ordinary unload/non-retained crash cleanup ends binding; cancellation of an already-issued command unspecified. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-bind-hotkey",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*bind_hotkey)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "return t_->bind_hotkey(self_, chord, command, args.size() ? args.begin() : nullptr, static_cast<uint32_t>(args.size()));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "return _t->bind_hotkey(Self, c, n, block.Args, block.Count);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "const sco_result r = ui->bind_hotkey(s->self, chord, name, nargs ? args : NULL, (uint32_t)nargs);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract.",
        "cancellation of an already-issued command unspecified."
      ],
      "member_extent": 56,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "Binds chord to the command name (\"&lt;x&gt;.&lt;y&gt;\"; any plugin's or a host feature's) with nargs arguments (args may be NULL with 0), which are copied, strings included. When the product sees the chord it invokes the command through the command registry, as invoke would, with this plugin as the caller; the command needn't exist yet. SCO_BAD_ARG: a bad chord or command name, a bad argument, or the chord taken: bound already (by anyone, this plugin included) or reserved by the product; last_error names the owner. SCO_TOO_MANY: the host's hotkey table is full.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *, const sco_arg *, uint32_t)",
      "since": "`size >= 56`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.bind_hotkey",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*last_error)(sco_plugin* self, char* out, uint32_t* inout_size);`<br>The message of this plugin's last refused call (\"\" if none), NUL-terminated, with the size handshake.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-last-error",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*last_error)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "sco_result r = t_->last_error(self_, s.data(), &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "return Storage.Sized((buf, size) => _t->last_error(Self, buf, size), out byte[] b) == ScoResult.Ok ? Utf8.FromBytes(b) : \"\";"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "if (ui->last_error(s->self, msg, &size) == SCO_OK && msg[0]) {"
            }
          ],
          "status": "restricted",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 80,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "The message of this plugin's last refused call (\"\" if none), NUL-terminated, with the size handshake.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, char *, uint32_t *)",
      "since": "`size >= 80`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.last_error",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "unspecified",
      "buffer_contract": "`sco_result (*normalize_chord)(const char* chord, char* out, uint32_t* inout_size);`<br>Writes chord's normalized form, NUL-terminated, with the raw-handler size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). SCO_BAD_ARG: not a chord. No plugin handle needed; any thread.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-normalize-chord",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*normalize_chord)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "const sco_result r = t_->normalize_chord(chord, buf, &size);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "ScoResult r = Storage.Sized((buf, size) => { fixed (byte* cp = c) return _t->normalize_chord(cp, buf, size); }, out byte[] b);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "stopped-service refusal unspecified (implementation does not test started)."
      ],
      "member_extent": 72,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "Writes chord's normalized form, NUL-terminated, with the raw-handler size handshake (*inout_size: capacity in; bytes written, or needed with SCO_TOO_MANY, out). SCO_BAD_ARG: not a chord. No plugin handle needed; any thread.",
      "reentrancy": "unspecified",
      "results": "BAD_ARG invalid chord/buffer; TOO_MANY required bytes/allocation. Pure normalization needs no self; stopped-service refusal unspecified (implementation does not test started).",
      "service": "sco.ui",
      "signature": "sco_result (*)(const char *, char *, uint32_t *)",
      "since": "`size >= 72`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.normalize_chord",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*register_overlay)(sco_plugin* self, const char* id, sco_ui_draw_fn draw, void* ctx);`<br>Adds overlay id; overlays draw in registration order. SCO_BAD_ARG / SCO_TOO_MANY as for register_tab.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "unregister_overlay/ordinary unload/non-retained crash cleanup ends draws; off-thread unregister does not join an already-running draw. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-register-overlay",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*register_overlay)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "return detail::CanCall(t_, &sco_ui_v1::register_overlay) && detail::CanCall(t_, &sco_ui_v1::unregister_overlay)\n            ? t_->register_overlay(self_, id, draw, ctx) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "fixed (byte* i = Utf8.Z(id)) r = _t->register_overlay(Self, i, &DrawTrampoline, (void*)key);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 40,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "Adds overlay id; overlays draw in registration order. SCO_BAD_ARG / SCO_TOO_MANY as for register_tab.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *, sco_ui_draw_fn, void *)",
      "since": "`size >= 40`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.register_overlay",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*register_tab)(sco_plugin* self, const char* id, const char* title, int32_t order, sco_ui_draw_fn draw, void* ctx);`<br>Adds tab id with its title (1-63 bytes) at order: the product shows tabs by ascending order, ties in registration order. SCO_BAD_ARG: a bad or taken id, an id outside this plugin, a bad title, draw NULL. SCO_TOO_MANY: the host's tab table is full.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "unregister_tab/ordinary unload/non-retained crash cleanup ends draws; off-thread unregister does not join an already-running draw. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-register-tab",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*register_tab)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "return detail::CanCall(t_, &sco_ui_v1::register_tab) && detail::CanCall(t_, &sco_ui_v1::unregister_tab)\n            ? t_->register_tab(self_, id, title, order, draw, ctx) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "r = _t->register_tab(Self, i, t, order, &DrawTrampoline, (void*)key);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 16,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "Adds tab id with its title (1-63 bytes) at order: the product shows tabs by ascending order, ties in registration order. SCO_BAD_ARG: a bad or taken id, an id outside this plugin, a bad title, draw NULL. SCO_TOO_MANY: the host's tab table is full.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *, int32_t, sco_ui_draw_fn, void *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.register_tab",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*set_badge)(sco_plugin* self, const char* tab_id, const char* text);`<br>Sets the short text the product shows beside the tab title (\"3\", \"new\"; at most 15 bytes); NULL or \"\" clears it. SCO_NOT_FOUND: this plugin has no tab by that id.",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-set-badge",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*set_badge)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "return detail::CanCall(t_, &sco_ui_v1::set_badge) ? t_->set_badge(self_, tabId, text) : SCO_UNAVAILABLE;"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "return _t->set_badge(Self, i, t);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 32,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "Sets the short text the product shows beside the tab title (\"3\", \"new\"; at most 15 bytes); NULL or \"\" clears it. SCO_NOT_FOUND: this plugin has no tab by that id.",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *)",
      "since": "`size >= 32`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.set_badge",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*unbind_hotkey)(sco_plugin* self, const char* chord);`<br>SCO_NOT_FOUND: this plugin has no binding on that chord (a bad chord included).",
      "callback_context": "draw callbacks game thread.",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-unbind-hotkey",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*unbind_hotkey)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "sco_result UnbindHotkey(const char* chord) noexcept { return detail::CanCall(t_, &sco_ui_v1::unbind_hotkey) ? t_->unbind_hotkey(self_, chord) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "fixed (byte* c = Utf8.Z(chord)) return _t->unbind_hotkey(Self, c);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "return PushUiResult(L, s, ui, ui->unbind_hotkey(s->self, chord));"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "Other recursive reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 64,
      "ownership": "Strings/arguments copied; draw/ctx borrowed until unregister/unload. Host owns registry; no allocation transfer.",
      "purpose": "SCO_NOT_FOUND: this plugin has no binding on that chord (a bad chord included).",
      "reentrancy": "unspecified",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 64`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.unbind_hotkey",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tests/test_lua.cpp",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; draw callbacks game thread. Other recursive reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*unregister_overlay)(sco_plugin* self, const char* id);`<br>SCO_NOT_FOUND: this plugin has no overlay by that id.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-unregister-overlay",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*unregister_overlay)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "sco_result RemoveOverlay(const char* id) noexcept { return detail::CanCall(t_, &sco_ui_v1::unregister_overlay) ? t_->unregister_overlay(self_, id) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "fixed (byte* i = Utf8.Z(id)) r = _t->unregister_overlay(Self, i);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 48,
      "ownership": "Removes own overlay. Free ctx immediately on game thread, including inside draw; elsewhere defer freeing via run_on_game_thread.",
      "purpose": "SCO_NOT_FOUND: this plugin has no overlay by that id.",
      "reentrancy": "allowed inside own draw.",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 48`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.unregister_overlay",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; allowed inside own draw. Other reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Absent table: query_service NOT_FOUND",
      "buffer_contract": "`sco_result (*unregister_tab)(sco_plugin* self, const char* id);`<br>Removes one of this plugin's tabs, and its badge. SCO_NOT_FOUND: it has none by that id.",
      "callback_context": "unspecified",
      "cleanup": "No in-flight cancellation API; unregister/unbind removes registration; ordinary unload/non-retained crash cleanup withdraws all UI. Retained-provider faults skip owner resource-release hooks and require restart; backing resources remain retained, not safe for cached calls. Guarded draws stop, but snapshots and chord reservations remain.",
      "examples": [],
      "id": "sco-ui-v1-unregister-tab",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_ui.h",
              "token": "(*unregister_tab)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_ui.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/ui.hpp",
              "token": "sco_result RemoveTab(const char* id) noexcept { return detail::CanCall(t_, &sco_ui_v1::unregister_tab) ? t_->unregister_tab(self_, id) : SCO_UNAVAILABLE; }"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/abi_ui.c",
            "tests/test_settings.cpp",
            "tests/test_ui.cpp",
            "tools/test.sh"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Ui.cs",
              "token": "fixed (byte* i = Utf8.Z(id)) r = _t->unregister_tab(Self, i);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
            "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/ui.md",
              "token": "Scripts bind hotkeys; tabs and overlays need draw callbacks from Lua"
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "Other reentrancy unspecified.",
        "Additional failures/output state unspecified unless described in the buffer contract."
      ],
      "member_extent": 24,
      "ownership": "Removes own tab and badge. Free ctx immediately on game thread, including inside draw; elsewhere defer freeing via run_on_game_thread.",
      "purpose": "Removes one of this plugin's tabs, and its badge. SCO_NOT_FOUND: it has none by that id.",
      "reentrancy": "allowed inside own draw.",
      "results": "Absent table: query_service NOT_FOUND; stopped self-taking methods: UNAVAILABLE; invalid/released self: BAD_ARG; allocation exceptions: TOO_MANY. Additional failures/output state unspecified unless described in the buffer contract.",
      "service": "sco.ui",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_ui.h",
      "symbol": "sco_ui_v1.unregister_tab",
      "table": "sco_ui_v1",
      "table_size": 80,
      "tests": [
        "tests/abi_ui.c",
        "tests/test_settings.cpp",
        "tests/test_ui.cpp",
        "sdk/csharp/Sco.Sdk.Tests/FakeHost.cs",
        "tools/test.sh",
        "sdk/csharp/Sco.Sdk.Tests/Layout.cs"
      ],
      "thread_affinity": "Any thread; allowed inside own draw. Other reentrancy unspecified.",
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    {
      "absent_capability": "Check the table size covers the member and the pointer is non-NULL: a 1.0 table (24 bytes) has no 1.1 members. query_service answers UNAVAILABLE for 1.1 against a 1.0 host.",
      "buffer_contract": "`sco_result (*capabilities)(sco_plugin* self, uint32_t* caps);`<br>caps[0] is the array length on entry (at least 2) and the number of elements written on success; the host fills the SCO_WIDGETS_CAP_* indices it knows up to that length: feature bits, then the running limits for panels, nodes/panel, live nodes, items, columns, text bytes and events per pass. 1.1 defines 9 elements. Failure writes nothing.",
      "callback_context": "No plugin callback.",
      "cleanup": "Synchronous query; nothing to release. No cancellation entrypoint.",
      "examples": [],
      "id": "sco-widgets-v1-capabilities",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*capabilities)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_widgets.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*capabilities)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_widgets11.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No scosdk C++ wrapper, C# or Lua route for the 1.1 members yet; C and C++ call the table directly.",
        "Headless host tests only; not run in game. Renderer presentation of severity, tooltips and paging is the host adapter's."
      ],
      "member_extent": 48,
      "ownership": "Caller-owned array written in place. No allocation transfer.",
      "purpose": "caps[0] is the array length on entry (at least 2) and the number of elements written on success; the host fills the SCO_WIDGETS_CAP_* indices it knows up to that length: feature bits, then the running limits for panels, nodes/panel, live nodes, items, columns, text bytes and events per pass. 1.1 defines 9 elements. Failure writes nothing.",
      "reentrancy": "Callable from an event callback; reads constants under the registry lock, never held during plugin code.",
      "results": "OK; WRONG_THREAD off game thread; UNAVAILABLE stopped service/host; BAD_ARG invalid/released owner, NULL caps or caps[0] below 2.",
      "service": "sco.widgets",
      "signature": "sco_result (*)(sco_plugin *, uint32_t *)",
      "since": "`size >= 48`; 1.1",
      "source_header": "include/sco_widgets.h",
      "symbol": "sco_widgets_v1.capabilities",
      "table": "sco_widgets_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_widgets.c",
        "tests/test_widgets11.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. No callbacks.",
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    },
    {
      "absent_capability": "Check the table size covers the member and the pointer is non-NULL: a 1.0 table (24 bytes) has no 1.1 members. query_service answers UNAVAILABLE for 1.1 against a 1.0 host.",
      "buffer_contract": "`sco_result (*remove_nodes)(sco_plugin* self, const char* panel_id, const uint32_t* node_ids, uint32_t count);`<br>Atomically removes 1..256 listed nodes of an owned panel, each with its subtree. Every ID must be nonzero and present; a removal that would empty the panel is refused (use remove_panel). The ID array is read during the call only. Failure preserves the tree.",
      "callback_context": "Event, text and panel ID borrowed during callback only; callback ctx is plugin-owned.",
      "cleanup": "Success starts a new generation: remaining events of the current pass drop and the change renders next pass. Owner release and fault rules as set_panel. No separate cancel token.",
      "examples": [],
      "id": "sco-widgets-v1-remove-nodes",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*remove_nodes)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_widgets.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*remove_nodes)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_widgets11.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No scosdk C++ wrapper, C# or Lua route for the 1.1 members yet; C and C++ call the table directly.",
        "Headless host tests only; not run in game. Renderer presentation of severity, tooltips and paging is the host adapter's."
      ],
      "member_extent": 40,
      "ownership": "Host releases the removed copies; caller keeps the ID array. fn/ctx unchanged. No allocation transfer.",
      "purpose": "Atomically removes 1..256 listed nodes of an owned panel, each with its subtree. Every ID must be nonzero and present; a removal that would empty the panel is refused (use remove_panel). The ID array is read during the call only. Failure preserves the tree.",
      "reentrancy": "Callable from the panel's own event callback; generation change drops remaining stale events, new tree renders next pass. Registry lock not held during plugin code.",
      "results": "OK; WRONG_THREAD off game thread; UNAVAILABLE stopped service/host; BAD_ARG invalid owner/ID, NULL or empty array, zero ID or emptied panel; NOT_FOUND absent owned panel or node ID; TOO_MANY more than 256 IDs. Failure atomic.",
      "service": "sco.widgets",
      "signature": "sco_result (*)(sco_plugin *, const char *, const uint32_t *, uint32_t)",
      "since": "`size >= 40`; 1.1",
      "source_header": "include/sco_widgets.h",
      "symbol": "sco_widgets_v1.remove_nodes",
      "table": "sco_widgets_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_widgets.c",
        "tests/test_widgets11.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. Callbacks game thread under owner callout guard.",
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    },
    {
      "absent_capability": "query_service NOT_FOUND absent service; UNAVAILABLE incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*remove_panel)(sco_plugin* self, const char* id);`<br>Removes an owned panel. Absent ID returns NOT_FOUND; success ends pending callbacks for that generation and permits immediate ctx destruction, including inside its callback. Failure preserves the panel.",
      "callback_context": "Event, text and panel ID borrowed during callback only; callback ctx is plugin-owned.",
      "cleanup": "Successful replacement/removal and ordinary owner release discard stale-generation events and end borrowed callbacks. Fault guard stops delivery; retained-provider faults skip ordinary resource release until restart. No separate cancel token.",
      "examples": [
        "sdk/examples/widgets/widgets.c",
        "sdk/examples/widgets_lua/main.lua",
        "sdk/examples/cs_widgets/WidgetsExample.cs"
      ],
      "id": "sco-widgets-v1-remove-panel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*remove_panel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_widgets.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/widgets.hpp",
              "token": "return table_->remove_panel(self_, id);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_widgets_sdk.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Widgets.cs",
              "token": "_t->set_panel(_plugin.SelfPtr"
            },
            {
              "path": "sdk/csharp/Sco.Sdk/Widgets.cs",
              "token": "_t->remove_panel(_plugin.SelfPtr"
            },
            {
              "path": "sdk/csharp/Sco.Sdk/WidgetsInterop.cs",
              "token": "public unsafe struct ScoWidgetsV1"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/WidgetsTests.cs",
            "sdk/csharp/Sco.Sdk.Tests/WidgetsPins.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "t->set_panel(s->self"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "t->remove_panel(s->self"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "C# provides bounded copied UTF-8 trees and registry-rooted callbacks; Windows NativeAOT host loading remains unverified locally.",
        "Lua uses bounded declarative tables, registry-rooted callbacks and shared sandbox budgets; no native FFI or draw callbacks.",
        "Host adapter controls appearance/placement; native plugins are not sandboxed. Headless tests do not verify GPU rendering or gameplay."
      ],
      "member_extent": 24,
      "ownership": "Host releases copied tree and borrowed callback registration, never frees plugin ctx; caller may free ctx after success.",
      "purpose": "Removes an owned panel. Absent ID returns NOT_FOUND; success ends pending callbacks for that generation and permits immediate ctx destruction, including inside its callback. Failure preserves the panel.",
      "reentrancy": "Callbacks may invoke commands or replace/remove own panel; generation change drops remaining stale events, new tree renders next pass. Registry lock not held during plugin code.",
      "results": "OK; WRONG_THREAD off game thread; UNAVAILABLE stopped service/host; BAD_ARG invalid/released owner or malformed ID; NOT_FOUND absent owned panel. Failure leaves registration unchanged.",
      "service": "sco.widgets",
      "signature": "sco_result (*)(sco_plugin *, const char *)",
      "since": "`size >= 24`; 1.0",
      "source_header": "include/sco_widgets.h",
      "symbol": "sco_widgets_v1.remove_panel",
      "table": "sco_widgets_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_widgets.c",
        "tests/test_widgets.cpp",
        "tests/test_widgets_sdk.cpp",
        "tests/test_lua.cpp",
        "sdk/csharp/Sco.Sdk.Tests/WidgetsTests.cs",
        "sdk/csharp/Sco.Sdk.Tests/WidgetsPins.cs",
        "sdk/test-zip.sh"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. Callbacks game thread under owner callout guard.",
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    },
    {
      "absent_capability": "query_service NOT_FOUND absent service; UNAVAILABLE incompatible version. No game capability or renderer requirement.",
      "buffer_contract": "`sco_result (*set_panel)(sco_plugin* self, const char* id, const char* title, const sco_widget_node* nodes, uint32_t count, uint32_t node_stride, sco_widget_event_fn fn, void* ctx);`<br>Atomically adds/replaces an owned complete preorder tree. ID/title <=63 bytes; 1..256 nodes, aligned stride >=80 and node size within stride. Unique nonzero node IDs, parent 0 or preceding active ROW/COLUMN; all subtrees contiguous. Copies valid UTF-8 labels/text/items <=255 bytes; 256 items/node and 16 table columns. Zero unused fields; finite/ranged numeric values and valid selections. Failure preserves old tree/callback.",
      "callback_context": "Event, text and panel ID borrowed during callback only; callback ctx is plugin-owned.",
      "cleanup": "Successful replacement/removal and ordinary owner release discard stale-generation events and end borrowed callbacks. Fault guard stops delivery; retained-provider faults skip ordinary resource release until restart. No separate cancel token.",
      "examples": [
        "sdk/examples/widgets/widgets.c",
        "sdk/examples/widgets_lua/main.lua",
        "sdk/examples/cs_widgets/WidgetsExample.cs"
      ],
      "id": "sco-widgets-v1-set-panel",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*set_panel)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_widgets.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/scosdk/widgets.hpp",
              "token": "return table_->set_panel(self_, id, title, nodes, count, stride, fn, ctx);"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_widgets_sdk.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "sdk/csharp/Sco.Sdk/Widgets.cs",
              "token": "_t->set_panel(_plugin.SelfPtr"
            },
            {
              "path": "sdk/csharp/Sco.Sdk/Widgets.cs",
              "token": "_t->remove_panel(_plugin.SelfPtr"
            },
            {
              "path": "sdk/csharp/Sco.Sdk/WidgetsInterop.cs",
              "token": "public unsafe struct ScoWidgetsV1"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "sdk/csharp/Sco.Sdk.Tests/WidgetsTests.cs",
            "sdk/csharp/Sco.Sdk.Tests/WidgetsPins.cs"
          ]
        },
        "lua": {
          "evidence": [
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "t->set_panel(s->self"
            },
            {
              "path": "plugins/lua/sco_lua.c",
              "token": "t->remove_panel(s->self"
            }
          ],
          "status": "typed-wrapper",
          "tests": [
            "tests/test_lua.cpp"
          ]
        }
      },
      "limitations": [
        "C# provides bounded copied UTF-8 trees and registry-rooted callbacks; Windows NativeAOT host loading remains unverified locally.",
        "Lua uses bounded declarative tables, registry-rooted callbacks and shared sandbox budgets; no native FFI or draw callbacks.",
        "Host adapter controls appearance/placement; native plugins are not sandboxed. Headless tests do not verify GPU rendering or gameplay."
      ],
      "member_extent": 16,
      "ownership": "Host deep-copies tree/strings on success; fn/ctx borrowed until successful replacement/removal or ordinary owner release. No allocation transfer.",
      "purpose": "Atomically adds/replaces an owned complete preorder tree. ID/title <=63 bytes; 1..256 nodes, aligned stride >=80 and node size within stride. Unique nonzero node IDs, parent 0 or preceding active ROW/COLUMN; all subtrees contiguous. Copies valid UTF-8 labels/text/items <=255 bytes; 256 items/node and 16 table columns. Zero unused fields; finite/ranged numeric values and valid selections. Failure preserves old tree/callback.",
      "reentrancy": "Callbacks may invoke commands or replace/remove own panel; generation change drops remaining stale events, new tree renders next pass. Registry lock not held during plugin code.",
      "results": "OK; WRONG_THREAD off game thread; UNAVAILABLE stopped service/host; BAD_ARG malformed owner/ID/title/tree/size/stride/data; TOO_MANY limits or allocation failure. Failure atomic.",
      "service": "sco.widgets",
      "signature": "sco_result (*)(sco_plugin *, const char *, const char *, const sco_widget_node *, uint32_t, uint32_t, sco_widget_event_fn, void *)",
      "since": "`size >= 16`; 1.0",
      "source_header": "include/sco_widgets.h",
      "symbol": "sco_widgets_v1.set_panel",
      "table": "sco_widgets_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_widgets.c",
        "tests/test_widgets.cpp",
        "tests/test_widgets_sdk.cpp",
        "tests/test_lua.cpp",
        "sdk/csharp/Sco.Sdk.Tests/WidgetsTests.cs",
        "sdk/csharp/Sco.Sdk.Tests/WidgetsPins.cs",
        "sdk/test-zip.sh"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. Callbacks game thread under owner callout guard.",
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    },
    {
      "absent_capability": "Check the table size covers the member and the pointer is non-NULL: a 1.0 table (24 bytes) has no 1.1 members. query_service answers UNAVAILABLE for 1.1 against a 1.0 host.",
      "buffer_contract": "`sco_result (*update_nodes)(sco_plugin* self, const char* panel_id, const sco_widget_node* nodes, uint32_t count, uint32_t node_stride);`<br>Atomically replaces or inserts one subtree of an owned panel. nodes[0] is the root and every later node descends from it; node, stride and string rules as set_panel, with 1.0 or 1.1 node sizes. An existing root ID is replaced in place and keeps its parent; a new root ID becomes the last child of parent 0 or an existing ROW/COLUMN. IDs must not collide with nodes outside the replaced subtree; 256 nodes/panel and 4096 live nodes after the change. Failure preserves the tree.",
      "callback_context": "Event, text and panel ID borrowed during callback only; callback ctx is plugin-owned.",
      "cleanup": "Success starts a new generation: remaining events of the current pass drop and the change renders next pass. Owner release and fault rules as set_panel. No separate cancel token.",
      "examples": [],
      "id": "sco-widgets-v1-update-nodes",
      "kind": "table-method",
      "language_mappings": {
        "c": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*update_nodes)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/abi_widgets.c"
          ]
        },
        "cpp": {
          "evidence": [
            {
              "path": "include/sco_widgets.h",
              "token": "(*update_nodes)"
            }
          ],
          "status": "direct",
          "tests": [
            "tests/test_widgets11.cpp"
          ]
        },
        "csharp": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        },
        "lua": {
          "evidence": [
            {
              "path": "docs/contracts.md",
              "token": "C# and Lua sco.widgets 1.1 routes are unsupported."
            }
          ],
          "status": "unsupported",
          "tests": []
        }
      },
      "limitations": [
        "No scosdk C++ wrapper, C# or Lua route for the 1.1 members yet; C and C++ call the table directly.",
        "Headless host tests only; not run in game. Renderer presentation of severity, tooltips and paging is the host adapter's."
      ],
      "member_extent": 32,
      "ownership": "Host deep-copies the subtree on success; the panel's fn/ctx stay unchanged and borrowed. No allocation transfer.",
      "purpose": "Atomically replaces or inserts one subtree of an owned panel. nodes[0] is the root and every later node descends from it; node, stride and string rules as set_panel, with 1.0 or 1.1 node sizes. An existing root ID is replaced in place and keeps its parent; a new root ID becomes the last child of parent 0 or an existing ROW/COLUMN. IDs must not collide with nodes outside the replaced subtree; 256 nodes/panel and 4096 live nodes after the change. Failure preserves the tree.",
      "reentrancy": "Callable from the panel's own event callback; generation change drops remaining stale events, new tree renders next pass. Registry lock not held during plugin code.",
      "results": "OK; WRONG_THREAD off game thread; UNAVAILABLE stopped service/host; BAD_ARG malformed owner/ID/tree/size/stride/data or a moved root; NOT_FOUND absent owned panel; TOO_MANY limits or allocation failure. Failure atomic.",
      "service": "sco.widgets",
      "signature": "sco_result (*)(sco_plugin *, const char *, const sco_widget_node *, uint32_t, uint32_t)",
      "since": "`size >= 32`; 1.1",
      "source_header": "include/sco_widgets.h",
      "symbol": "sco_widgets_v1.update_nodes",
      "table": "sco_widgets_v1",
      "table_size": 48,
      "tests": [
        "tests/abi_widgets.c",
        "tests/test_widgets11.cpp"
      ],
      "thread_affinity": "Game thread only; WRONG_THREAD elsewhere. Callbacks game thread under owner callout guard.",
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    }
  ],
  "schema_version": 1,
  "sdk_version": "2.3.0",
  "source_sha": "e616ed69d8f9f77b0f4827881c86d91e4a7d1689",
  "tables": {
    "sc_actors_v1": {
      "context": "Source: [`sc_actors.h`](../include/sc_actors.h), [implementation](../src/game/services/actors.cpp), [layout pin](../tests/abi_game_actors.c).\n\n1.0 ends after last_error at 40 bytes; 1.1 appends health and state (56).\nEach operation has its named game.actors capability; state remains off pending\nin-game verification. NPCs owned here are removed on ordinary unload/non-retained crash cleanup; retained-provider faults skip release hooks and require restart. The quota counts\nalive **and being removed** (1,024 total). Spawning refuses without a release\nhook/removal readiness. last_error(NULL) is shared no-self query diagnostic, not\nper querying plugin. Health maximum is 0 meaning unknown, not zero capacity.",
      "members": [
        "local_player",
        "spawn_npc",
        "despawn",
        "last_error",
        "health",
        "state"
      ],
      "service": "game.actors",
      "size": 56,
      "source_header": "include/sc_actors.h",
      "version": 65537,
      "version_macro": "SC_ACTORS_VERSION_1_1"
    },
    "sc_asop_v1": {
      "context": "Source: [`sc_asop.h`](../include/sc_asop.h), [implementation](../src/game/services/asop_service.cpp), [engine reads](../src/game/services/asop_engine.cpp), [layout pin](../tests/abi_game_asop.c), [rows](game/asop-service.md).\n\nCapabilities: claim_timeout (`claim_timeout`) and shard_persisted (`shard_persisted`), both OFF by\ndefault pending an in-game run: while off, every call answers UNAVAILABLE without touching the\ngame. Both functions are reads: nothing is written to the game and nothing is owned. The game\npack's own ship terminal handling, when the product runs it, shortens the claim timeout; claim_timeout\nreports the value the game holds at the time of the call. C++, C# and Lua game.asop routes are unsupported.",
      "members": [
        "claim_timeout",
        "shard_persisted",
        "last_error"
      ],
      "service": "game.asop",
      "size": 32,
      "source_header": "include/sc_asop.h",
      "version": 65536,
      "version_macro": "SC_ASOP_SERVICE_VERSION"
    },
    "sc_contracts_v1": {
      "context": "Source: [`sc_contracts.h`](../include/sc_contracts.h), [implementation](../src/game/services/contracts_service.cpp), [engine reads](../src/game/services/contracts_engine.cpp), [layout pin](../tests/abi_game_contracts.c), [rows](game/contracts-service.md).\n\nCapability: stream_radius (`stream_radius`), OFF by default pending an in-game run: while off, the call answers\nUNAVAILABLE without touching the game. The function is a read: nothing is written to the game and nothing is\nowned. The service name is new; the host-internal `contracts.*` capabilities and the `game.missions` service are\nseparate. A product that runs offline contracts may write the stream radius; stream_radius reports the value the\ngame holds at the time of the call. C++, C# and Lua game.contracts routes are unsupported.",
      "members": [
        "stream_radius",
        "last_error"
      ],
      "service": "game.contracts",
      "size": 24,
      "source_header": "include/sc_contracts.h",
      "version": 65536,
      "version_macro": "SC_CONTRACTS_SERVICE_VERSION"
    },
    "sc_creative_v1": {
      "context": "Source: [`sc_creative.h`](../include/sc_creative.h), [implementation](../src/game/services/creative.cpp), [layout pin](../tests/abi_game_creative.c).\n\nCapabilities: god_mode, fly, ammo, ship_ammo; speed additionally needs the\nspeed-field rows. Toggles are global to the local player but owned by the last\nplugin to enable them; another plugin can turn them off or take ownership.\nEnabling refuses without a release hook. Owned speed restores on ordinary release, not on a retained-provider fault;\nthere is no speed-restore method. last_error is any-thread despite the header's\nblanket game-thread statement. Implementation chooses newer own/shared-query\nerror on game thread, whereas the header describes own error: **diagnostic\nisolation is unspecified**; ask immediately, do not depend on isolation.\nThe released-owner refusal guarantee is not uniformly enforced here either.",
      "members": [
        "set_god_mode",
        "set_fly_mode",
        "set_fly_speed",
        "set_infinite_ammo",
        "set_infinite_ship_ammo",
        "state",
        "last_error"
      ],
      "service": "game.creative",
      "size": 64,
      "source_header": "include/sc_creative.h",
      "version": 65536,
      "version_macro": "SC_CREATIVE_SERVICE_VERSION"
    },
    "sc_cvars_v1": {
      "context": "Source: [`sc_cvars.h`](../include/sc_cvars.h), [semantics and exact allowlist](game/cvars.md).\nRead-only, verified offline game-pack port; production capability OFF until engine ABI/type verification.\nC/C++ supported; C# and Lua unsupported. No arbitrary console or config file access.",
      "members": [
        "get_bool"
      ],
      "service": "game.cvars",
      "size": 16,
      "source_header": "include/sc_cvars.h",
      "version": 65536,
      "version_macro": "SC_CVARS_VERSION"
    },
    "sc_cvars_write_v1": {
      "context": "Source: [`sc_cvars_write.h`](../include/sc_cvars_write.h), [lifecycle and safe engine seam](game/cvars.md).\nSeparate reversible write acceptance; the read table and frozen root ABI are unchanged.\nC/C++ supported; C# and Lua unsupported. Production requires verified offline read/write ports and cleanup.",
      "members": [
        "set_bool",
        "restore_all"
      ],
      "service": "game.cvars_write",
      "size": 24,
      "source_header": "include/sc_cvars_write.h",
      "version": 65536,
      "version_macro": "SC_CVARS_WRITE_VERSION"
    },
    "sc_economy_v1": {
      "context": "Game-pack only. See [offline missions design](design/offline-missions.md).\nNo validated engine backend is installed; synthetic checks are not gameplay evidence.\nC/C++ direct table route; C# and Lua unsupported.",
      "members": [
        "balance",
        "apply",
        "receipt"
      ],
      "service": "game.economy",
      "size": 32,
      "source_header": "include/sc_economy.h",
      "version": 65536,
      "version_macro": "SC_ECONOMY_SERVICE_VERSION"
    },
    "sc_entities_v1": {
      "context": "Source: [`sc_entities.h`](../include/sc_entities.h), [implementation](../src/game/services/entities.cpp), [layout pin](../tests/abi_game_entities.c).\n\n1.0 is 88 bytes; 1.1 appends keep (96). Capabilities transform, spawn,\nclass_of, watch and query_radius; the last two remain off pending in-game\nverification. All owners combined: 1,024 owned spawns and 64 watches; filter\nlength at most 63 printable ASCII bytes, exact class or trailing-prefix `*`.\nA kept entity is no longer owned; the host does not despawn it at unload/crash.\n`query_radius.out_more` is the **number of omitted matches**, not the Boolean\nused by vehicle seats. max=0 writes no IDs and reports matches via out_more.\nFailure-output guarantees differ per method; do not assume all outputs unchanged.",
      "members": [
        "alive",
        "class_of",
        "get_transform",
        "set_transform",
        "spawn",
        "despawn",
        "watch",
        "unwatch",
        "query_radius",
        "last_error",
        "keep"
      ],
      "service": "game.entities",
      "size": 96,
      "source_header": "include/sc_entities.h",
      "version": 65537,
      "version_macro": "SC_ENTITIES_VERSION_1_1"
    },
    "sc_game_spatial_v1": {
      "context": "Source: [`sc_game_spatial.h`](../include/sc_game_spatial.h),\n[provider](../src/game/services/spatial.cpp),\n[shared portable logic](../src/game/services/spatial_model.h),\n[layout/C route](../tests/abi_game_spatial.c),\n[synthetic fixture](../tests/test_game_spatial.cpp).\n\nSeparate 1.0 table; `teleport.spatial` remains frozen. Native C and raw C++ only;\nC# and Lua unsupported. This is bounded **observation**, not a global memory dump,\nexhaustive streamed-zone scanner or unloaded-destination catalogue. Player ancestry\nis copied each tick; explicit ID observations and full-pose queries can add complete\nreadable chains. The strict provider refuses skipped, mirrored, truncated, cyclic\nor unreadable ancestry; at most 16 frames per game-read chain, 256 admitted IDs,\n64 output records per page. IDs are revalidated before metadata/pose calls;\nunstreaming/reparenting invalidates the observation set. Copied metadata is a\nhistorical observation within its epoch, not continuous engine liveness.\n\n**Root is not system:** no grounded star-system classifier exists in the available\nreads. `root_id` describes only confirmed outermost ancestry; `system_id` is 0 and\n`SC_GAME_ZONE_SYSTEM_UNKNOWN` is always set. Do not use it as relocation authorization\nor infer system identity from a name. That part of G3 remains safely unavailable.\nNo game pointers, memory bytes, player/account identifiers, assets or global scan.\nEpochs expire at tick refresh, set changes, invalidation and stop; consumers restart\npaging after refusal and never persist epoch validity across sessions. Synchronous,\nno callbacks, no ownership mutation or inputs retained. Native service-table fault\ncontainment is not certified. **Not verified on Windows or in game.**",
      "members": [
        "pose_to_zone",
        "zone_record",
        "find_zone",
        "list_zones"
      ],
      "service": "game.spatial",
      "size": 40,
      "source_header": "include/sc_game_spatial.h",
      "version": 65536,
      "version_macro": "SC_GAME_SPATIAL_VERSION"
    },
    "sc_hangar_v1": {
      "context": "Source: [`sc_hangar.h`](../include/sc_hangar.h), [implementation](../src/game/services/hangar.cpp), [engine calls](../src/game/services/hangar_engine.cpp), [layout pin](../tests/abi_game_hangar.c), [rows](game/hangar.md).\n\nCapabilities: lift (`lift_of_landing_area`, `lift_request`) and atc_cancel\n(`atc_cancel_request`), both OFF by default pending an in-game run: while off,\nevery call answers UNAVAILABLE without touching the game. Nothing is owned: a\nlift request or an ATC cancel is one call into the game, not coordinated with the\ngame pack's own Store/Retrieve, and nothing is undone at unload. C++ (scosdk::game::Hangar) and C# (Sco.Sdk.Game) wrap game.hangar. Lua game.hangar routes are unsupported.",
      "members": [
        "lift_of_landing_area",
        "lift_request",
        "atc_cancel_request",
        "last_error"
      ],
      "service": "game.hangar",
      "size": 40,
      "source_header": "include/sc_hangar.h",
      "version": 65536,
      "version_macro": "SC_HANGAR_SERVICE_VERSION"
    },
    "sc_loadout_v1": {
      "context": "Typed local-player loadout only, not account inventory. The game pack publishes a\nsession-lifetime table even while its mutation capability is false. Current production\ncomposition installs **no verified engine backend**: every valid request returns\nUNAVAILABLE without engine access. See [loadout](game/loadout.md) for acceptance blockers.\nC/C++ native routes only; C# and sandboxed Lua mutation are unsupported.",
      "members": [
        "apply"
      ],
      "service": "game.loadout",
      "size": 16,
      "source_header": "include/sc_loadout.h",
      "version": 65537,
      "version_macro": "SC_LOADOUT_VERSION_1_1"
    },
    "sc_mining_v1": {
      "context": "Source: [`sc_mining.h`](../include/sc_mining.h), [provider](../src/game/services/mining.cpp),\n[mining contract](game/mining-service.md), [C11 layout fixture](../tests/abi_catalogue_mining.c)\nand [synthetic provider/release fixture](../tests/test_mining.cpp).\nOff by default; production adapter unavailable. Accepted intent is not engine acceptance.\nC and raw C++ use the public table; C inline helpers guard complete callback extents.\nC# and Lua game.mining routes are unsupported.\nThe fixture uses synthetic engine/admission callbacks and a release-dispatcher stand-in;\nno Windows SEH, native detour or gameplay execution is established. Process counters\nare observations, not a transactional snapshot; no game pointers cross the table.",
      "members": [
        "request",
        "state"
      ],
      "service": "game.mining",
      "size": 24,
      "source_header": "include/sc_mining.h",
      "version": 65536,
      "version_macro": "SC_MINING_SERVICE_VERSION"
    },
    "sc_missions_v1": {
      "context": "Game-pack only. See [offline missions design](design/offline-missions.md).\nNo validated engine backend is installed; synthetic checks are not gameplay evidence.\nC/C++ direct table route; C# and Lua unsupported.",
      "members": [
        "offer",
        "status",
        "accept",
        "objective",
        "advance",
        "abandon",
        "ingest"
      ],
      "service": "game.missions",
      "size": 64,
      "source_header": "include/sc_missions.h",
      "version": 65536,
      "version_macro": "SC_MISSIONS_SERVICE_VERSION"
    },
    "sc_owned_v1": {
      "context": "Game-pack-only composition: explicit retained build ownership while loaded, not\nacross-reload persistence; actors-owned NPC and fresh expected-seat NPC removal\nare distinct authorities. Receipts prove initiation only, never `alive=0` completion.\nC/C++ direct tables; C#/Lua unsupported. See [ownership decision](design/owned-removal.md).",
      "members": [
        "retain_build",
        "remove_build",
        "remove_npc",
        "remove_seat_npc",
        "receipt",
        "forget"
      ],
      "service": "game.owned",
      "size": 56,
      "source_header": "include/sc_owned.h",
      "version": 65536,
      "version_macro": "SC_OWNED_VERSION_1_0"
    },
    "sc_prefabs_v1": {
      "context": "Independent table over the existing entity spawner, mover and delayed despawn.\nPrefab IDs are in the game.entities ledger, including not-yet-streamed spawns;\nretain_build preserves undo while loaded, not across reload. No keep-based undo.\nCanonical content-relative paths do not authorize external files or content\nexports. Native adapter ports existing spawn.prefabs rows and ocFilename writer;\nproduction operation is enabled by default for R1 by owner approval.\nWindows/SEH/streamed cleanup are NOT VERIFIED; readiness/fault refusals remain.\nC/C++ supported; C# and read-only Lua unsupported. [Design](design/prefabs.md).",
      "members": [
        "spawn"
      ],
      "service": "game.prefabs",
      "size": 16,
      "source_header": "include/sc_prefabs.h",
      "version": 65536,
      "version_macro": "SC_PREFABS_VERSION_1_0"
    },
    "sc_private_session_v1": {
      "context": "Source: [`sc_private_session.h`](../include/sc_private_session.h),\n[provider](../src/game/private_session.cpp), [C11 layout pin](../tests/abi_private_session.c)\nand [synthetic broker/provider fixture](../tests/test_net_control.cpp).\nC and raw C++ use the public table; no typed native wrapper is claimed.\nC# and Lua game.private_session routes are unsupported.\nBroker enablement is not socket/session enablement: fresh local UI Host/Join consent\nis mandatory; never synthesize consent from startup, settings, peer replay or retry.\nNumeric bind, exact private-address allowlist, admission and transport remain host-owned.\nDefault enabled broker is loopback-only and opens no socket until Host/Join.\nThe source-linked fixture uses synthetic transport with socket traps; it does not\nprove native UDP, real peer authentication or gameplay. ABI pins prove layout only.\nRequest strings are declared UTF-8; byte bounds/NUL checks do not certify Unicode validation.",
      "members": [
        "request_host",
        "request_join",
        "leave",
        "get_state"
      ],
      "service": "game.private_session",
      "size": 40,
      "source_header": "include/sc_private_session.h",
      "version": 65536,
      "version_macro": "SC_PRIVATE_SESSION_VERSION"
    },
    "sc_quantum_v1": {
      "context": "See [offline quantum](quantum.md). Production engine bridge unavailable; synthetic control-state evidence only.",
      "members": [
        "enable",
        "hold",
        "release",
        "state"
      ],
      "service": "game.quantum",
      "size": 40,
      "source_header": "include/sc_quantum.h",
      "version": 65536,
      "version_macro": "SC_QUANTUM_SERVICE_VERSION"
    },
    "sc_relocation_v1": {
      "context": "Local-player request/cancel/status contract; game pack only. The game pack's provider is\nfail-closed: the capability `game.relocation` is on only while the host certifies offline\nadmission and the engine rows resolve, a live player and known star system exist and the\nproduct switch is on ([details](game-services.md#relocation-gamerelocation-10)). Fixtures\ntest the machinery and provider, not gameplay. Native C/raw C++ supported;\nC# and Lua unsupported. Frozen sco_api and legacy teleport.spatial unchanged.\n\n| Member | Since | Buffer contract | Ownership | Thread | Results | Cleanup |\n|---|---|---|---|---|---|---|\n| `sc_relocation_v1.request` | `size >= 16`; 1.0 | `sco_result (*request)(sco_plugin* self, const sc_relocation_request* request, uint64_t* out_ticket);`<br>Admit a copied finite bounded position and normalized quaternion for a streamed nonzero target zone. Request size at least 72, timeout 1..60000ms. Requires known equal nonzero systems, host-certified offline/session/player and validated transport. Unknown safety or system refuses. One global pending request. Output ticket unchanged on refusal; admission is not completion. | Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission. | Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state. | SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure. | Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo. |\n| `sc_relocation_v1.cancel` | `size >= 24`; 1.0 | `sco_result (*cancel)(sco_plugin* self, uint64_t ticket);`<br>Owner-only idempotent cancellation of a known ticket. Does not undo movement already initiated. Foreign or evicted tickets are NOT_FOUND. Zero ticket is BAD_ARG. | Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission. | Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state. | SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure. | Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo. |\n| `sc_relocation_v1.status` | `size >= 32`; 1.0 | `sco_result (*status)(sco_plugin* self, uint64_t ticket, sc_relocation_status* out);`<br>Owner-only copied status; caller size at least 24. Preserve caller size and unknown tail. Pending, complete, cancelled or failed plus bounded reason and applied flag. Status does not advance work. Foreign or evicted ticket NOT_FOUND; output unchanged on failure. | Local player only; owner-scoped opaque tickets. No arbitrary entity/pointer/owner writes. Copied request and caller-owned output. 32 retained terminal tickets; oldest terminal evicted at admission. | Game thread only; wrong thread returns SCO_WRONG_THREAD without touching state. | SCO_OK success; SCO_BAD_ARG invalid input/self; SCO_UNAVAILABLE missing safety/player/transport or unknown/different systems; SCO_TOO_MANY pending global request or ticket exhaustion; SCO_NOT_FOUND foreign/unknown/evicted ticket. Outputs unchanged on failure. | Owner unload cancels/forgets tickets; stop forgets all; ticket sequence never recycled. Session/player/system change, safety/transport loss or fault fails pending. Stream loss waits up to timeout. Completion requires fresh pose within 0.05m and quaternion absolute normalized dot at least 0.999999. Cancellation is not undo. |",
      "members": [
        "request",
        "cancel",
        "status"
      ],
      "service": "game.relocation",
      "size": 32,
      "source_header": "include/sc_relocation.h",
      "version": 65536,
      "version_macro": "SC_RELOCATION_VERSION"
    },
    "sc_reputation_v1": {
      "context": "Source: [`sc_reputation.h`](../include/sc_reputation.h), [implementation](../src/game/services/reputation.cpp), [engine reads](../src/game/services/reputation_engine.cpp), [layout pin](../tests/abi_game_reputation.c), [rows](game/reputation.md).\n\nCapability: checks (`checks`), OFF by default pending an in-game run: while off,\nchecks answers UNAVAILABLE without touching the game. Read-only: checks reads the\nreputation-service check sites and the services global the rows locate; nothing reads or\nchanges a player's standing, nothing is called or written in the game, and nothing is\nowned. C++ (scosdk::game::Reputation) and C# (Sco.Sdk.Game) wrap game.reputation. Lua game.reputation routes are unsupported.",
      "members": [
        "checks",
        "last_error"
      ],
      "service": "game.reputation",
      "size": 24,
      "source_header": "include/sc_reputation.h",
      "version": 65536,
      "version_macro": "SC_REPUTATION_SERVICE_VERSION"
    },
    "sc_spatial_v1": {
      "context": "Source: [`sc_spatial.h`](../include/sc_spatial.h), [implementation](../src/game/services/spatial.cpp), [layout pin](../tests/abi_spatial.c).\n\nAll six methods return 1 answered / 0 unavailable or invalid, leaving outputs\nuntouched on 0. Double positions in metres; rotation quaternion x,y,z,w. Zone 0\nis world for conversions, not for zone_name; zone IDs are volatile streaming\nhandles. Every query reads game state afresh. Return 0 is not distinguishable as\na typed result or diagnostic error through this table.",
      "members": [
        "player_pose",
        "zone_of_entity",
        "local_to_world",
        "world_to_local",
        "zone_to_zone",
        "zone_name"
      ],
      "service": "teleport.spatial",
      "size": 56,
      "source_header": "include/sc_spatial.h",
      "version": 65536,
      "version_macro": "SC_SPATIAL_SERVICE_VERSION"
    },
    "sc_spawn_service_v1": {
      "context": "Source: [`sc_spawn.h`](../include/sc_spawn.h), [implementation](../src/game/services/spawn.cpp), [layout pin](../tests/abi_spawn.c).\n\n1.0 is 40 bytes; 1.1 appends entity_alive (48); 1.2 appends mover/spawn_as\n(64). Game-thread failures return 0/ID 0 or a borrowed reason string, not\nsco_result. Fresh ID exists before streaming completes; alive must be checked\non later ticks. spawn_as ownership is movement bookkeeping, not the actor/entity\nservices' auto-despawn guarantee. Its implementation can spawn successfully and\nthen fail tracking; do not treat every non-NULL reason as “nothing spawned.”\nWhether a product registers player vehicles is product-specific, not established\nby this table or older header commentary. See [spawn service](api-v1.md#spawnentities-12-game-pack).",
      "members": [
        "spawn_near_player",
        "class_exists",
        "local_player_id",
        "player_ship_id",
        "entity_alive",
        "set_entity_transform",
        "spawn_as"
      ],
      "service": "spawn.entities",
      "size": 64,
      "source_header": "include/sc_spawn.h",
      "version": 65538,
      "version_macro": "SC_SPAWN_SERVICE_VERSION"
    },
    "sc_vehicles_v1": {
      "context": "Source: [`sc_vehicles.h`](../include/sc_vehicles.h), [implementation](../src/game/services/vehicles.cpp), [layout pin](../tests/abi_game_vehicles.c).\n\nCapability seats gates player_ship/seats/seat_occupant; seat gates seat/eject;\nflight_ready gates power_on. `sc_vehicle_seat` stride is frozen at 96 bytes;\nname is 64 bytes including NUL. Missing USABLE_KNOWN means unknown usability,\nnot false; an occupied but undecodable actor can have occupant_id 0. Mutations\ncheck permitted actor/vehicle ownership, not arbitrary game objects. Per-method\nBAD_ARG checks exist, but these implementations do not uniformly test the\nreleased-owner marker: do not infer the host API's post-unload rejection guarantee.\nError outputs on WRONG_THREAD are not uniformly zeroed. See [vehicles](api-v1.md#gamevehicles-10-game-pack).",
      "members": [
        "player_ship",
        "seats",
        "seat_occupant",
        "seat",
        "eject",
        "power_on",
        "last_error"
      ],
      "service": "game.vehicles",
      "size": 64,
      "source_header": "include/sc_vehicles.h",
      "version": 65536,
      "version_macro": "SC_VEHICLES_SERVICE_VERSION"
    },
    "sc_world_control_v1": {
      "context": "Independent size-prefixed extension; `game.world` 1.0 and frozen `sco_api`\nare unchanged. Native C/C++ only; C# and sandboxed Lua routes unsupported.\n[Design and evidence limits](design/world-control.md); [header](../include/sc_world_control.h).\nProduction capabilities `game.world.raycast_filtered` and `game.world.free_camera`\nare OFF: no guessed engine adapter. Synthetic policy is not gameplay proof.",
      "members": [
        "raycast_filtered",
        "camera_acquire",
        "camera_step",
        "camera_release"
      ],
      "service": "game.world.control",
      "size": 40,
      "source_header": "include/sc_world_control.h",
      "version": 65536,
      "version_macro": "SC_WORLD_CONTROL_VERSION_1_0"
    },
    "sc_world_v1": {
      "context": "Source: [`sc_world.h`](../include/sc_world.h), [implementation](../src/game/services/world.cpp), [layout pin](../tests/abi_game_world.c).\n\nCapabilities raycast/camera. Read-only, no entity ownership or game pointers.\nRay origin/output use zone frame; camera pose uses world frame plus player's\nzone ID. Hit is size-prefixed; in 1.0 entity_id/normal/flags stay zero, not inferred\nfrom the game. No field of view. Failure zeroes only an adequately-sized hit;\nNULL/undersized output is rejected before zeroing, and caller extra tail is not\nwritten. last_error is shared across query callers, with no per-plugin isolation.\n1.1 appends free_camera_flag (capability game.world.free_camera_flag, OFF by\ndefault pending an in-game run): a read of the free-camera flag byte, never a\ntoggle. C++, C# and Lua wrap game.world free_camera_flag, each checking the table size first.",
      "members": [
        "raycast",
        "camera",
        "last_error",
        "free_camera_flag"
      ],
      "service": "game.world",
      "size": 40,
      "source_header": "include/sc_world.h",
      "version": 65537,
      "version_macro": "SC_WORLD_VERSION_1_1"
    },
    "sco_api": {
      "context": "Source: [`sco_api.h`](../include/sco_api.h), [implementation](../src/host/sco_host.cpp), [layout pin](../tests/abi_v1.c).\n\nAPI 1.0 ends at 88 bytes; 1.1 adds the five final methods through 128 bytes.\n`register_command` requires at least the 72-byte descriptor, at most 16 arguments,\nnon-NULL fn, and for nonempty defs `arg_def_size >= 24` and aligned to the argument\ndefinition alignment. Copied strings have limits: name/title/capability 63 bytes,\nhelp 255, argument name 31 and help 127, excluding NUL. Replies have a 256-byte\nhost buffer including NUL. Normal unloading removes owned registrations/queued\nwork; void methods silently ignore invalid self rather than returning BAD_ARG.\nSource for registry/queue details: [commands](../src/api/sco_commands.cpp),\n[events](../src/api/sco_events.cpp), [tasks](../src/api/sco_tasks.cpp),\n[services](../src/api/sco_services.cpp), [raw handlers](../src/api/sco_raw.cpp).\nThe immediate invoke's “done once” rule applies after initial validation; invalid\nself/name/count/buffer combinations can return without entering completion.",
      "members": [
        "host_version",
        "has",
        "run_on_game_thread",
        "subscribe",
        "unsubscribe",
        "status",
        "log",
        "register_command",
        "invoke",
        "list_commands",
        "provide_service",
        "query_service",
        "release_service",
        "invoke_raw",
        "register_raw"
      ],
      "service": "sco_api",
      "size": 128,
      "source_header": "include/sco_api.h",
      "version": 65537,
      "version_macro": "SCO_API_MAJOR/SCO_API_MINOR"
    },
    "sco_content_v1": {
      "context": "Source: [`sco_content.h`](../include/sco_content.h),\n[implementation](../src/content/content.cpp), [layout pin](../tests/abi_content.c).\n[G14 audit/design](design/content-access.md) records why the private index and\ncommand registry were insufficient. This game-neutral service copies enabled\nlist/script pack bytes before consumer loads. Only startup snapshots are exposed;\nno file paths or script execution. All calls require the game thread and live\nself. Global limits: 4096 items, 16 MiB bytes; 1 MiB per file. A pack is refused\natomically on unsafe/unreadable content or quotas, including dependent packs.\nSize handshakes are binary: no appended NUL. Host restart invalidates old IDs.\nC++ `scosdk/content.hpp` guards full extents/null pointers and failed reopen;\nC#/Lua are not exposed. Synthetic kernel-only fixtures are not game evidence.",
      "members": [
        "item",
        "read"
      ],
      "service": "sco.content",
      "size": 24,
      "source_header": "include/sco_content.h",
      "version": 65536,
      "version_macro": "SCO_CONTENT_VERSION_1_0"
    },
    "sco_datacore_v1": {
      "context": "Source: [`sco_datacore.h`](../include/sco_datacore.h), [implementation](../src/datacore/service.cpp), [layout pin](../tests/abi_datacore.c).\n\n1.1 changes `add_record` availability, **not layout**: both versions are 88\nbytes and that pointer already exists in 1.0 (returns UNAVAILABLE there). Value\nstructs use `sco_dc_value.size`; report requires at least `sizeof(sco_dc_report)`.\n64 open/queued patches per plugin and 65,536 operations per patch. Operations\ncopy inputs and validate syntax immediately; record/type/field resolution and\natomic application happen at the one game load. Before load, commit queues;\nafter load it saves for future launches, never patches the current session late.\n`NON_ATOMIC` permits partial application. Patch-level reports carry deferred\nfailures; there is no `last_error` method. The implementation's container/string\nallocations have no per-method allocation-exception translation guarantee in\nthis table; that failure contract is **unspecified** rather than inferred from\nother services' guards. See [DataCore](datacore.md#the-scodatacore-service).",
      "members": [
        "state",
        "begin",
        "set",
        "add_instance",
        "set_pointer",
        "append",
        "add_record",
        "commit",
        "discard",
        "report"
      ],
      "service": "sco.datacore",
      "size": 88,
      "source_header": "include/sco_datacore.h",
      "version": 65537,
      "version_macro": "SCO_DATACORE_VERSION_1_1"
    },
    "sco_diagnostics_publisher_v1": {
      "context": "Default-off host-selected source ingress, not an observation endpoint. Fixed\nadvisory health only; no text, identifiers, callbacks, read method or side channel.\nExtra fields stay internal, not runtime JSON v1. See [sources](design/diagnostics-publishers.md).\nNative C/C++ only; no C#/Lua binding. Synthetic checked; not run in game.",
      "members": [
        "submit"
      ],
      "service": "sco.diagnostics.publisher",
      "size": 16,
      "source_header": "include/sco_diagnostics_publisher.h",
      "version": 65536,
      "version_macro": "SCO_DIAGNOSTICS_PUBLISHER_VERSION_1_0"
    },
    "sco_ipc_v1": {
      "context": "Source: [`sco_ipc.h`](../include/sco_ipc.h), [implementation](../src/ipc/ipc.cpp), [layout pin](../tests/abi_ipc.c).\n\nChannels are restricted to the caller's namespace. New Windows mappings receive\na DACL granting access only to the current user. Reused mappings are checked\nfor current-user ownership and sufficient size, not their existing DACL;\ncurrent-user-only access is therefore not guaranteed on reuse.\nBounds: 16 channels/plugin, 32 rings/channel, 4 KiB–256 MiB/channel, 512 MiB total\nper plugin. Offsets exclude the first 64 header bytes; blocks align to 8 bytes,\nrings to 64; ring data capacity is power-of-two, at least 64. Peer data is\nuntrusted. Wire FULL/TOO_SMALL map to TOO_MANY; EMPTY/NOT_READY to NOT_FOUND;\nBAD_ARG/MISMATCH to BAD_ARG; corrupt/epoch/busy/gone cases to FAILED. The header\nsays copy operations never block; the implementation still takes mutexes and\nallocates staging buffers, so **no lock-free or bounded-latency guarantee** is\nestablished. View access/close synchronization is the caller's responsibility;\nits precise concurrency contract is unspecified. See [IPC](ipc.md).",
      "members": [
        "create",
        "peer_age_ms",
        "block_write",
        "block_read",
        "ring_init",
        "ring_push",
        "ring_pop",
        "view",
        "close"
      ],
      "service": "sco.ipc",
      "size": 80,
      "source_header": "include/sco_ipc.h",
      "version": 65536,
      "version_macro": "SCO_IPC_VERSION_1_0"
    },
    "sco_net_v1": {
      "context": "Source: [`sco_net.h`](../include/sco_net.h), [implementation](../src/net/service.cpp), [layout pin](../tests/abi_net.c).\n\nPublication also exposes `sco.net` capability. No active session is different\nfrom no service: registrations work offline, is_active/self_peer return 0,\nget_peers succeeds with zero peers, sends return UNAVAILABLE. No plugin method\nopens/joins/leaves a session. Session-scoped peer IDs are opaque; host ID is 1.\nChannel name at most 64 bytes, under own plugin id; 32 channels/plugin. Payload\nmax is 1,200 unreliable or 262,144 reliable bytes. Defaults: 256 messages and\n524,288 bytes/plugin/second, product-adjustable; quota overflow drops send.\nReliable channel ordering/delivery semantics apply to an established session,\nnot a guarantee that queued sends survive disconnection or unload. Messages are\nnot encrypted: do not send secrets. See [network messages](net.md).",
      "members": [
        "is_active",
        "get_peers",
        "get_peer_name",
        "send_channel",
        "register_channel",
        "unregister_channel",
        "self_peer"
      ],
      "service": "sco.net",
      "size": 64,
      "source_header": "include/sco_net.h",
      "version": 65536,
      "version_macro": "SCO_NET_VERSION_1_0"
    },
    "sco_settings_v1": {
      "context": "Source: [`sco_settings.h`](../include/sco_settings.h), [implementation](../src/settings/settings.cpp), [layout pin](../tests/abi_settings.c).\n\nRead-only declared settings; no setters. Names at most 31 bytes, strings at\nmost 255 bytes excluding NUL. Scalar failure leaves output untouched; a string\nsize handshake can change its size output while leaving its text buffer\nuntouched. Values read from memory, not storage per call. settings.changed\npayload is borrowed and size-prefixed, dispatched on game thread after storing\nthe value, for every plugin's changes. See [settings](api-v1.md#scosettings-10).",
      "members": [
        "get_bool",
        "get_int",
        "get_float",
        "get_string",
        "last_error"
      ],
      "service": "sco.settings",
      "size": 48,
      "source_header": "include/sco_settings.h",
      "version": 65536,
      "version_macro": "SCO_SETTINGS_VERSION_1_0"
    },
    "sco_storage_v1": {
      "context": "Source: [`sco_storage.h`](../include/sco_storage.h), [implementation](../src/storage/storage.cpp), [layout pin](../tests/abi_storage.c).\n\nOne database, transaction and cursor namespace per plugin, not per thread. Any\nthread can use the plugin's transaction/cursor, but concurrent calls serialize.\nKeys are 1–255 bytes; values 0–1 MiB; at most 64 open cursors per plugin. The\nhost may allocate copies, statements and cursors; callers never receive SQLite\nmemory. Database quota and statement budgets are host-configured, not fixed by\nthe method table. A budget failure is FAILED, not an API cancellation callback.\nFor SQL restrictions and persistence settings see [storage](storage.md).",
      "members": [
        "put",
        "get",
        "del",
        "next_key",
        "begin",
        "commit",
        "rollback",
        "exec",
        "query",
        "step",
        "column_count",
        "column",
        "column_name",
        "close",
        "last_error"
      ],
      "service": "sco.storage",
      "size": 128,
      "source_header": "include/sco_storage.h",
      "version": 65536,
      "version_macro": "SCO_STORAGE_VERSION_1_0"
    },
    "sco_ui_surfaces_v1": {
      "context": "Source: [`sco_ui_surfaces.h`](../include/sco_ui_surfaces.h), [implementation](../src/ui/surfaces.cpp), [layout pin](../tests/abi_ui_surfaces.c);\nhost tests: `tests/test_surfaces.cpp`. Renderer-neutral placement of sco.widgets panels, host-owned\nservice 1.0: a 2D HUD rectangle, a camera-facing 3D billboard or a world-anchored 3D quad. The host\nkeeps a validated registry (owner, kind, pose, panel id) and draws nothing; the product's renderer\nreads it through `sco/surfaces.h` and projects each surface itself ([UI: Surfaces](ui.md#surfaces)\ndocuments the billboard and quad math). Payloads are size-prefixed `sco_surface_desc` (16 bytes)\nand `sco_surface_pose` (112 bytes); sizes must cover the 1.0 structs, larger tails are ignored.\nLimits: 32 surfaces per plugin, 256 in all, panel id 63 bytes, 3D extent 1000 m, max distance\n1e7 m, coordinates 1e12 m, unit-vector tolerance 1e-3. Ids are host-assigned, nonzero and never\nreused while the host runs. Owner cleanup (unload, crash) rides sco.ui's release hook, so the host\npublishes this service only while sco.ui runs. C is direct; C++ has `scosdk/ui_surfaces.hpp`.\nC# and Lua sco.ui.surfaces routes are unsupported.",
      "members": [
        "register_surface",
        "update_surface_pose",
        "unregister_surface",
        "last_error"
      ],
      "service": "sco.ui.surfaces",
      "size": 40,
      "source_header": "include/sco_ui_surfaces.h",
      "version": 65536,
      "version_macro": "SCO_UI_SURFACES_VERSION_1_0"
    },
    "sco_ui_v1": {
      "context": "Source: [`sco_ui.h`](../include/sco_ui.h), [implementation](../src/ui/ui.cpp), [layout pin](../tests/abi_ui.c).\n\nIDs/titles at most 63 bytes, badge 15, chord 31, hotkey arguments 16, each\nstored argument string 255. Tabs sort by order then registration; overlays by\nregistration. The product, not this registry, renders and supplies the frame\ncontext (borrowed during draw). Draw faults disable the owning plugin. Unregister\non another thread does not wait for current draw: defer ctx deletion with\nrun_on_game_thread. See [UI](ui.md) for chord grammar/reserved keys and renderer\nintegration. normalize_chord does not require a live UI service once a pointer\nwas obtained (implementation observation), unlike self-taking mutations.",
      "members": [
        "register_tab",
        "unregister_tab",
        "set_badge",
        "register_overlay",
        "unregister_overlay",
        "bind_hotkey",
        "unbind_hotkey",
        "normalize_chord",
        "last_error"
      ],
      "service": "sco.ui",
      "size": 80,
      "source_header": "include/sco_ui.h",
      "version": 65536,
      "version_macro": "SCO_UI_VERSION_1_0"
    },
    "sco_widgets_v1": {
      "context": "Renderer-neutral retained panels, host-owned service 1.1. Source: `include/sco_widgets.h`,\n`src/widgets/widgets.cpp`; design: [widgets](design/widgets.md). This does not change\nthe frozen sco_api ABI or the legacy sco.ui draw-context/hotkey route. Limits:\n64 panels, 256 nodes/panel, 4096 live nodes, 256 items/node, 16 table columns.\nStrings are copied UTF-8, plain text; callbacks and context are borrowed. All\nmethods/events are game-thread only. Events update retained state then dispatch\nunder the owner guard; replacing/removing a panel invalidates pending generations.\nC is direct; C++ has `scosdk/widgets.hpp`; Lua has bounded `sco.widgets` tables\nand registry-rooted typed callbacks. C# is unsupported/deferred in\n[#142](https://github.com/scubamount/sco-core/issues/142), a follow-up to #139.\nThe optional ImGui adapter is host-only; plugins never include it.\n\n1.1 appends `update_nodes`, `remove_nodes` and `capabilities` (table 24 -> 48 bytes) and\nadds opt-in `sco_widget_node_1_1` (104 bytes: tooltip, severity, LIST/TABLE paging) and\n`sco_widget_event_1_1` (40 bytes: row). The 80-byte node and 32-byte event are unchanged, so\n1.0 strides and size checks stay valid; a node below 104 bytes is a 1.0 node. Panels that\nhold a 1.1 node receive 1.1 events, including `SCO_WIDGET_EVENT_PAGE`; other panels keep\n32-byte events. Render snapshots are rebuilt at most once per panel render pass, after a\nchange. C# and Lua sco.widgets 1.1 routes are unsupported. Pins: `tests/abi_widgets.c`; host tests:\n`tests/test_widgets11.cpp`.",
      "members": [
        "set_panel",
        "remove_panel",
        "update_nodes",
        "remove_nodes",
        "capabilities"
      ],
      "service": "sco.widgets",
      "size": 48,
      "source_header": "include/sco_widgets.h",
      "version": 65537,
      "version_macro": "SCO_WIDGETS_VERSION_1_1"
    }
  }
}
