Lab Chain-of-Custody: Reconciliation Under Audit
Seed a lab rack from a declarative manifest, trigger a deterministic preflight failure, and reconcile via grid-free placement.
If you are reading this cold, this is a lab reconciliation workflow: deterministic custody tracking, preflight conflict detection, and a verified remediation move. Every custody change is an auditable commit so investigators can replay, verify, and explain what happened without inference.
The Problem: Custody Breaks Under Audit
Clinical chains of custody fail when physical inventory, scanner logs, and operational systems disagree. When a placement fails, you need deterministic evidence that the system detected the conflict before any state change.
This scenario demonstrates a production-grade pattern: a forced preflight failure, a read-guided remediation, and a replayable audit trail.
Why this matters
Regulated labs need traceable custody and deterministic remediation when conflicts appear. Asset Core makes custody authoritative by treating every change as a deterministic, replayable transaction.
System model
- Racks: grid containers enforcing occupancy rules per lab.
- Scanner bay: slot container for in-flight custody checks.
- Reagent pools: balance containers with fixed-point quantization.
- Classes and shapes: registered so placement rules stay consistent.
- Units: cells (fixed_point_scale=1000).
Workflow at a glance
- Setup - Register classes and create lab containers.
- Seed - Seed initial tubes and balances.
- Preflight Blocked - Preflight fails when placing into an occupied cell.
- Grid Free - Select the next available grid anchor.
- Reconcile - Move the scanner tube into a verified free anchor.
- Verify Grid - Confirm reconciled placement in read projection.
How to read the walkthrough
- Single-operation steps use action helpers for readability.
- Multi-operation steps stay as commit calls to preserve atomicity.
- Rust HTTP always uses the commit endpoint with one or more operations.
Scenario artifacts
- manifest.json - Scenario metadata and IDs.
- lab_chain_of_custody_actions.json - Action-first walkthrough payloads.
- lab_chain_of_custody_transcript.json - Full request/response log.
- http_snapshot.json - Condensed commit outcomes.
- lab_chain_of_custody_steps.json - Deterministic step index.
Latest verification
- Run ID:
2026-01-19T18-52-12Z-lab_chain_of_custody - Status: Passed
- Integrity root hash:
efcb02df86d0dd2bb9ffd14d8a7403e52bd06b7c5f56fb4fc4f04703dc9f542f - Checks:
{'kind': 'structural_invariants'}: passed{'kind': 'world_seq_monotonic'}: passed{'kind': 'global_seq_monotonic'}: passed{'kind': 'owner_scope', 'allowed_owners': [1, 2]}: passed{'kind': 'quantity_conservation', 'container_id': 4, 'class_id': 2, 'stack_key': None, 'expected': 250000}: passed{'kind': 'replay_idempotent'}: passed{'kind': 'commit_log_integrity', 'expected_chain_hash': 'aa3301e51d32150b30281395b68f6df815eaff8416260789832c06259e84a30c', 'expected_prev_chain_hash': 'c387f5f5a7fec5ce1223fa9dcbc8d564a5221e50a7afa1fba498c625d693f064', 'expected_start_offset': 1, 'expected_end_offset': 3, 'expected_entry_count': 3, 'expected_last_global_seq': 38}: passed{'kind': 'runpack_integrity'}: passed
Runpack downloads
Scenario snapshot
{
"scenario_id": "lab_chain_of_custody",
"version": "0.1.0",
"namespace_id": 2,
"containers": {
"rack_lab_a": "container-32001",
"rack_lab_b": "container-32002",
"reagent_pool_lab_a": "container-32004",
"reagent_pool_lab_b": "container-32005",
"scanner_bay_lab_a": "container-32003"
},
"classes": {
"reagent_buffer": "class-42002",
"sample_tube": "class-42001"
},
"units": {
"fixed_point_scale": 1000,
"length_unit": "cells",
"time_unit": "ms"
}
}
Failure branch
POSITION_OCCUPIED -> grid_free -> reconcile move
Audit trail (optional)
The transcript captures the exact request and response pairs emitted during the run. Here is a compact excerpt you can use to validate determinism and metadata propagation:
{
"kind": "commit",
"name": "setup",
"request": {
"path": "/v1/write/namespaces/2/commit",
"idempotency_key": "lab-chain-setup",
"actor_id": "lab-chain",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"operations": [
"RegisterClass",
"RegisterClassShape",
"RegisterClass",
"CreateContainer",
"CreateContainer",
"CreateContainer",
"CreateContainer",
"CreateContainer"
]
},
"response": {
"commit_id": "00000000000000000000000000000003",
"world_seq_start": 1,
"world_seq_end": 8,
"event_count": 8
}
}
Preflight note
- Action calls submit commits by default.
- Set ActionOptions(preflight=True) or call assetcore_commit_preflight for validation.
SDK setup
from assetcore_sdk import AssetCoreClient
from assetcore_sdk.actions import ActionOptions
from assetcore_sdk.operations import (
AddFungible,
AddInstance,
CreateContainer,
MoveInstance,
RegisterClass,
RegisterClassShape,
)
# Snippets assume an async context (e.g., inside async def main()).
write_client = AssetCoreClient(
base_url="http://localhost:8080",
api_key="WRITE_API_KEY",
)
read_client = AssetCoreClient(
base_url="http://localhost:8081",
api_key="READ_API_KEY",
)#include "asset_core.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static void check_ok(int32_t code, const char* label) {
if (code == ERROR_SUCCESS) {
return;
}
fprintf(stderr, "%s failed: %d\n", label, code);
abort();
}
OpaqueRuntime* runtime = NULL;
AssetRuntimeConfig config = {0};
config.struct_size = sizeof(AssetRuntimeConfig);
config.clock_type = AssetClockType_System;
check_ok(asset_runtime_create(&config, &runtime), "asset_runtime_create");use reqwest::Client;
use serde_json::json;
let client = Client::new();
let write_base_url = "http://localhost:8080";
let read_base_url = "http://localhost:8081";
let write_api_key = "WRITE_API_KEY";
let read_api_key = "READ_API_KEY";Walkthrough
Step 1: Setup
Register classes and create lab containers.
Operations
RegisterClass(x2) - Registers a class definition so future operations can reference it.RegisterClassShape- Registers a grid shape footprint for a class or class variant.CreateContainer(x5) - Creates a container (structured memory region) with the requested kind.
await write_client.commit_operations(
[
RegisterClass(
request={
"behavior": {"balance_scale": 1},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube",
},
),
RegisterClassShape(
request={"class_id": "class-42001", "shape": {"height": 1, "width": 1}},
),
RegisterClass(
request={
"behavior": {"balance_scale": 1000},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer",
},
),
CreateContainer(
client_tag="rack_lab_a",
external_id="container-32001",
kind={"capacity": 96, "grid_width": 12, "type": "grid"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="rack_lab_b",
external_id="container-32002",
kind={"capacity": 96, "grid_width": 12, "type": "grid"},
owner_external_id="owner-102",
policies=None,
),
CreateContainer(
client_tag="scanner_bay_lab_a",
external_id="container-32003",
kind={"count": 2, "type": "slots"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="reagent_pool_lab_a",
external_id="container-32004",
kind={"quantization_inv": 1000, "type": "balance"},
owner_external_id="owner-101",
policies=None,
),
CreateContainer(
client_tag="reagent_pool_lab_b",
external_id="container-32005",
kind={"quantization_inv": 1000, "type": "balance"},
owner_external_id="owner-102",
policies=None,
),
],
namespace_id=2,
idempotency_key="lab-chain-setup",
actor_id="lab-chain",
metadata={"phase": "setup", "scenario": "lab_chain_of_custody"},
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
{
AssetClassBehavior behavior = {0};
behavior.has_balance_scale = 1;
behavior.balance_scale = 1;
uint32_t out_class_id = 0;
check_ok(asset_tx_register_class(runtime,
tx,
42001,
0,
&behavior,
(const uint8_t*)"sample_tube",
11,
&out_class_id),
"asset_tx_register_class[0]");
}
{
AssetItemShape shape = {.width = 1, .height = 1};
uint32_t inserted = 0;
check_ok(asset_tx_register_class_shape(runtime, tx, 42001, 0, shape, &inserted),
"asset_tx_register_class_shape[1]");
}
{
AssetClassBehavior behavior = {0};
behavior.has_balance_scale = 1;
behavior.balance_scale = 1000;
uint32_t out_class_id = 0;
check_ok(asset_tx_register_class(runtime,
tx,
42002,
0,
&behavior,
(const uint8_t*)"reagent_buffer",
14,
&out_class_id),
"asset_tx_register_class[2]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Grid;
kind.capacity = 96;
kind.grid_width = 12;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32001, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[3]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Grid;
kind.capacity = 96;
kind.grid_width = 12;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32002, kind, 102, NULL, &out_container_id),
"asset_tx_create_container[4]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Slots;
kind.slots = 2;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32003, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[5]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Balance;
kind.quantization_inv = 1000;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32004, kind, 101, NULL, &out_container_id),
"asset_tx_create_container[6]");
}
{
AssetContainerKind kind = {0};
kind.kind = AssetContainerKindTag_Balance;
kind.quantization_inv = 1000;
uint32_t out_container_id = 0;
check_ok(
asset_tx_create_container(runtime, tx, 32005, kind, 102, NULL, &out_container_id),
"asset_tx_create_container[7]");
}
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_commit",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-setup",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"request": {
"behavior": {
"balance_scale": 1
},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube"
}
},
"op": "RegisterClass"
},
{
"args": {
"request": {
"class_id": "class-42001",
"shape": {
"height": 1,
"width": 1
}
}
},
"op": "RegisterClassShape"
},
{
"args": {
"request": {
"behavior": {
"balance_scale": 1000
},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer"
}
},
"op": "RegisterClass"
},
{
"args": {
"client_tag": "rack_lab_a",
"external_id": "container-32001",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "rack_lab_b",
"external_id": "container-32002",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "scanner_bay_lab_a",
"external_id": "container-32003",
"kind": {
"count": 2,
"type": "slots"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_a",
"external_id": "container-32004",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_b",
"external_id": "container-32005",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-setup",
"metadata": {
"phase": "setup",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"request": {
"behavior": {
"balance_scale": 1
},
"class_id": "class-42001",
"flags": 0,
"name": "sample_tube"
}
},
"op": "RegisterClass"
},
{
"args": {
"request": {
"class_id": "class-42001",
"shape": {
"height": 1,
"width": 1
}
}
},
"op": "RegisterClassShape"
},
{
"args": {
"request": {
"behavior": {
"balance_scale": 1000
},
"class_id": "class-42002",
"flags": 0,
"name": "reagent_buffer"
}
},
"op": "RegisterClass"
},
{
"args": {
"client_tag": "rack_lab_a",
"external_id": "container-32001",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "rack_lab_b",
"external_id": "container-32002",
"kind": {
"capacity": 96,
"grid_width": 12,
"type": "grid"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "scanner_bay_lab_a",
"external_id": "container-32003",
"kind": {
"count": 2,
"type": "slots"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_a",
"external_id": "container-32004",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-101",
"policies": null
},
"op": "CreateContainer"
},
{
"args": {
"client_tag": "reagent_pool_lab_b",
"external_id": "container-32005",
"kind": {
"quantization_inv": 1000,
"type": "balance"
},
"owner_external_id": "owner-102",
"policies": null
},
"op": "CreateContainer"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;Step 2: Seed
Seed initial tubes and balances.
Operations
AddInstance(x25) - Mints a new instance and places it at a target location.AddFungible(x2) - Adds fungible quantity to a balance or an explicit grid cell.
await write_client.commit_operations(
[
AddInstance(
class_id="class-42001",
client_tag="tube-001",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-002",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-003",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-004",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-005",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-006",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-007",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-008",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-009",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-010",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-011",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-012",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-013",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-014",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-015",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-016",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-017",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-018",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-019",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-020",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-021",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-022",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-023",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="tube-024",
key=None,
location={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": None,
},
),
AddInstance(
class_id="class-42001",
client_tag="scanner-tube",
key=None,
location={
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1,
},
),
AddFungible(
class_id="class-42002",
client_tag="reagent-a",
key=None,
location={"container_id": "container-32004", "kind": "balance"},
quantity="250",
),
AddFungible(
class_id="class-42002",
client_tag="reagent-b",
key=None,
location={"container_id": "container-32005", "kind": "balance"},
quantity="125",
),
],
namespace_id=2,
idempotency_key="lab-chain-seed",
actor_id="lab-chain",
metadata={"phase": "seed", "scenario": "lab_chain_of_custody"},
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 1;
location_0.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_0, &instance_id),
"asset_tx_add_instance_semantic[0]");
}
AssetInstanceLocation location_1 = {0};
location_1.kind = AssetInstanceLocationKind_GridCell;
location_1.container = 32001;
location_1.position = 2;
location_1.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_1, &instance_id),
"asset_tx_add_instance_semantic[1]");
}
AssetInstanceLocation location_2 = {0};
location_2.kind = AssetInstanceLocationKind_GridCell;
location_2.container = 32001;
location_2.position = 3;
location_2.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_2, &instance_id),
"asset_tx_add_instance_semantic[2]");
}
AssetInstanceLocation location_3 = {0};
location_3.kind = AssetInstanceLocationKind_GridCell;
location_3.container = 32001;
location_3.position = 4;
location_3.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_3, &instance_id),
"asset_tx_add_instance_semantic[3]");
}
AssetInstanceLocation location_4 = {0};
location_4.kind = AssetInstanceLocationKind_GridCell;
location_4.container = 32001;
location_4.position = 5;
location_4.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_4, &instance_id),
"asset_tx_add_instance_semantic[4]");
}
AssetInstanceLocation location_5 = {0};
location_5.kind = AssetInstanceLocationKind_GridCell;
location_5.container = 32001;
location_5.position = 6;
location_5.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_5, &instance_id),
"asset_tx_add_instance_semantic[5]");
}
AssetInstanceLocation location_6 = {0};
location_6.kind = AssetInstanceLocationKind_GridCell;
location_6.container = 32001;
location_6.position = 7;
location_6.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_6, &instance_id),
"asset_tx_add_instance_semantic[6]");
}
AssetInstanceLocation location_7 = {0};
location_7.kind = AssetInstanceLocationKind_GridCell;
location_7.container = 32001;
location_7.position = 8;
location_7.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_7, &instance_id),
"asset_tx_add_instance_semantic[7]");
}
AssetInstanceLocation location_8 = {0};
location_8.kind = AssetInstanceLocationKind_GridCell;
location_8.container = 32001;
location_8.position = 9;
location_8.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_8, &instance_id),
"asset_tx_add_instance_semantic[8]");
}
AssetInstanceLocation location_9 = {0};
location_9.kind = AssetInstanceLocationKind_GridCell;
location_9.container = 32001;
location_9.position = 10;
location_9.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_9, &instance_id),
"asset_tx_add_instance_semantic[9]");
}
AssetInstanceLocation location_10 = {0};
location_10.kind = AssetInstanceLocationKind_GridCell;
location_10.container = 32001;
location_10.position = 11;
location_10.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_10, &instance_id),
"asset_tx_add_instance_semantic[10]");
}
AssetInstanceLocation location_11 = {0};
location_11.kind = AssetInstanceLocationKind_GridCell;
location_11.container = 32001;
location_11.position = 12;
location_11.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_11, &instance_id),
"asset_tx_add_instance_semantic[11]");
}
AssetInstanceLocation location_12 = {0};
location_12.kind = AssetInstanceLocationKind_GridCell;
location_12.container = 32001;
location_12.position = 13;
location_12.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_12, &instance_id),
"asset_tx_add_instance_semantic[12]");
}
AssetInstanceLocation location_13 = {0};
location_13.kind = AssetInstanceLocationKind_GridCell;
location_13.container = 32001;
location_13.position = 14;
location_13.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_13, &instance_id),
"asset_tx_add_instance_semantic[13]");
}
AssetInstanceLocation location_14 = {0};
location_14.kind = AssetInstanceLocationKind_GridCell;
location_14.container = 32001;
location_14.position = 15;
location_14.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_14, &instance_id),
"asset_tx_add_instance_semantic[14]");
}
AssetInstanceLocation location_15 = {0};
location_15.kind = AssetInstanceLocationKind_GridCell;
location_15.container = 32001;
location_15.position = 16;
location_15.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_15, &instance_id),
"asset_tx_add_instance_semantic[15]");
}
AssetInstanceLocation location_16 = {0};
location_16.kind = AssetInstanceLocationKind_GridCell;
location_16.container = 32001;
location_16.position = 17;
location_16.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_16, &instance_id),
"asset_tx_add_instance_semantic[16]");
}
AssetInstanceLocation location_17 = {0};
location_17.kind = AssetInstanceLocationKind_GridCell;
location_17.container = 32001;
location_17.position = 18;
location_17.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_17, &instance_id),
"asset_tx_add_instance_semantic[17]");
}
AssetInstanceLocation location_18 = {0};
location_18.kind = AssetInstanceLocationKind_GridCell;
location_18.container = 32001;
location_18.position = 19;
location_18.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_18, &instance_id),
"asset_tx_add_instance_semantic[18]");
}
AssetInstanceLocation location_19 = {0};
location_19.kind = AssetInstanceLocationKind_GridCell;
location_19.container = 32001;
location_19.position = 20;
location_19.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_19, &instance_id),
"asset_tx_add_instance_semantic[19]");
}
AssetInstanceLocation location_20 = {0};
location_20.kind = AssetInstanceLocationKind_GridCell;
location_20.container = 32001;
location_20.position = 21;
location_20.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_20, &instance_id),
"asset_tx_add_instance_semantic[20]");
}
AssetInstanceLocation location_21 = {0};
location_21.kind = AssetInstanceLocationKind_GridCell;
location_21.container = 32001;
location_21.position = 22;
location_21.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_21, &instance_id),
"asset_tx_add_instance_semantic[21]");
}
AssetInstanceLocation location_22 = {0};
location_22.kind = AssetInstanceLocationKind_GridCell;
location_22.container = 32001;
location_22.position = 23;
location_22.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_22, &instance_id),
"asset_tx_add_instance_semantic[22]");
}
AssetInstanceLocation location_23 = {0};
location_23.kind = AssetInstanceLocationKind_GridCell;
location_23.container = 32001;
location_23.position = 24;
location_23.rotation = AssetRotation_None;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_23, &instance_id),
"asset_tx_add_instance_semantic[23]");
}
AssetInstanceLocation location_24 = {0};
location_24.kind = AssetInstanceLocationKind_Slot;
location_24.container = 32003;
location_24.slot = 1;
{
uint64_t instance_id = 0;
check_ok(
asset_tx_add_instance_semantic(runtime, tx, 42001, 0, location_24, &instance_id),
"asset_tx_add_instance_semantic[24]");
}
AssetFungibleLocation location_25 = {0};
location_25.kind = AssetFungibleLocationKind_Balance;
location_25.container = 32004;
check_ok(asset_tx_add_fungible_semantic(runtime, tx, 42002, 0, 250, location_25),
"asset_tx_add_fungible_semantic[25]");
AssetFungibleLocation location_26 = {0};
location_26.kind = AssetFungibleLocationKind_Balance;
location_26.container = 32005;
check_ok(asset_tx_add_fungible_semantic(runtime, tx, 42002, 0, 125, location_26),
"asset_tx_add_fungible_semantic[26]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_commit",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-seed",
"metadata": {
"phase": "seed",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-001",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-002",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-003",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-004",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-005",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-006",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-007",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-008",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-009",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-010",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-011",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-012",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-013",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-014",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-015",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-016",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-017",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-018",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-019",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-020",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-021",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-022",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-023",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-024",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "scanner-tube",
"key": null,
"location": {
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-a",
"key": null,
"location": {
"container_id": "container-32004",
"kind": "balance"
},
"quantity": "250"
},
"op": "AddFungible"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-b",
"key": null,
"location": {
"container_id": "container-32005",
"kind": "balance"
},
"quantity": "125"
},
"op": "AddFungible"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-seed",
"metadata": {
"phase": "seed",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-001",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 1,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-002",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 2,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-003",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 3,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-004",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 4,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-005",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 5,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-006",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-007",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 7,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-008",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 8,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-009",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 9,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-010",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 10,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-011",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 11,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-012",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 12,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-013",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 13,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-014",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 14,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-015",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 15,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-016",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 16,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-017",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 17,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-018",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 18,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-019",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 19,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-020",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 20,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-021",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 21,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-022",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 22,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-023",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 23,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "tube-024",
"key": null,
"location": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 24,
"rotation": null
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42001",
"client_tag": "scanner-tube",
"key": null,
"location": {
"container_id": "container-32003",
"kind": "slot",
"slot_index": 1
}
},
"op": "AddInstance"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-a",
"key": null,
"location": {
"container_id": "container-32004",
"kind": "balance"
},
"quantity": "250"
},
"op": "AddFungible"
},
{
"args": {
"class_id": "class-42002",
"client_tag": "reagent-b",
"key": null,
"location": {
"container_id": "container-32005",
"kind": "balance"
},
"quantity": "125"
},
"op": "AddFungible"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;Step 3: Preflight Blocked (Expected error)
Preflight fails when placing into an occupied cell.
Operations
MoveInstance- Moves an existing instance to a new location.
Expected error
{
"code": "POSITION_OCCUPIED",
"detail": "Position 6 in container 1 is occupied by item at anchor 6",
"hint": "Select an unoccupied position or move the existing item first.",
"retryable": false,
"status": 409,
"title": "ConflictError",
"type": "urn:assetcore:error:POSITION_OCCUPIED"
}
await write_client.actions.move_instance(
instance="inst-25",
to={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": None,
},
options=ActionOptions(
namespace_id=2,
idempotency_key="lab-chain-blocked",
actor_id="lab-chain",
metadata={"phase": "exception", "scenario": "lab_chain_of_custody"},
),
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 6;
location_0.rotation = AssetRotation_None;
check_ok(asset_tx_move_instance_semantic(runtime, tx, 25, location_0),
"asset_tx_move_instance_semantic[0]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_move_instance",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-blocked",
"metadata": {
"phase": "exception",
"scenario": "lab_chain_of_custody"
},
"namespace_id": 2,
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "MoveInstance"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-blocked",
"metadata": {
"phase": "exception",
"scenario": "lab_chain_of_custody"
},
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 6,
"rotation": null
}
},
"op": "MoveInstance"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit/preflight", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;Step 4: Grid Free
Select the next available grid anchor.
await read_client.get_container_grid_free(
container_id="container-32001",
namespace_id=2,
height=1,
width=1,
){
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_find_grid_free",
"params": {
"container_id": "container-32001",
"height": 1,
"namespace_id": 2,
"width": 1
}
}let request = client
.get(format!("{}/v1/read/namespaces/2/containers/container-32001/grid/free", read_base_url))
.query(&[("height", 1), ("width", 1)])
.bearer_auth(read_api_key)
.send()
.await?;
let body = request.text().await?;Step 5: Reconcile
Move the scanner tube into a verified free anchor.
Operations
MoveInstance- Moves an existing instance to a new location.
await write_client.actions.move_instance(
instance="inst-25",
to={
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": None,
},
options=ActionOptions(
namespace_id=2,
idempotency_key="lab-chain-reconcile",
actor_id="lab-chain",
metadata={
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25,
},
),
)OpaqueTransaction* tx = NULL;
check_ok(asset_tx_begin(runtime, 2, &tx), "asset_tx_begin");
AssetInstanceLocation location_0 = {0};
location_0.kind = AssetInstanceLocationKind_GridCell;
location_0.container = 32001;
location_0.position = 25;
location_0.rotation = AssetRotation_None;
check_ok(asset_tx_move_instance_semantic(runtime, tx, 25, location_0),
"asset_tx_move_instance_semantic[0]");
AssetTxMeta meta = {0};
OpaqueEventBatch* batch = NULL;
check_ok(asset_tx_commit(runtime, tx, &meta, &batch), "asset_tx_commit");
asset_event_batch_destroy(runtime, batch);{
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_move_instance",
"params": {
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-reconcile",
"metadata": {
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25
},
"namespace_id": 2,
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": null
}
},
"op": "MoveInstance"
}
]
}
}let payload = json!({
"actor_id": "lab-chain",
"idempotency_key": "lab-chain-reconcile",
"metadata": {
"phase": "reconcile",
"scenario": "lab_chain_of_custody",
"target_anchor": 25
},
"operations": [
{
"args": {
"instance": "inst-25",
"to": {
"container_id": "container-32001",
"kind": "grid_cell",
"position": 25,
"rotation": null
}
},
"op": "MoveInstance"
}
]
});
let response = client
.post(format!("{}/v1/write/namespaces/2/commit", write_base_url))
.bearer_auth(write_api_key)
.json(&payload)
.send()
.await?;Step 6: Verify Grid
Confirm reconciled placement in read projection.
await read_client.get_container_grid(
container_id="container-32001",
namespace_id=2,
){
"id": 1,
"jsonrpc": "2.0",
"method": "assetcore_get_container_grid",
"params": {
"container_id": "container-32001",
"namespace_id": 2
}
}let request = client
.get(format!("{}/v1/read/namespaces/2/containers/container-32001/grid/cells", read_base_url))
.bearer_auth(read_api_key)
.send()
.await?;
let body = request.text().await?;