Cadena de Custodia del Laboratorio: Reconciliación Bajo Auditoría
Siembra un rack de laboratorio a partir de un manifiesto declarativo, activa un fallo de pre-vuelo determinista y reconcilia a través de una colocación sin cuadrícula.
Si está leyendo esto sin contexto, este es un flujo de trabajo de reconciliación de laboratorio: seguimiento de custodia determinista, detección de conflictos en pre-vuelo y un movimiento de remediación verificado. Cada cambio de custodia es un compromiso auditable, por lo que los investigadores pueden reproducir, verificar y explicar lo que sucedió sin inferencias.
El Problema: Interrupciones de Custodia Bajo Auditoría
Las cadenas de custodia clínicas fallan cuando el inventario físico, los registros de escáner y los sistemas operativos no coinciden. Cuando una colocación falla, necesitas evidencia determinista de que el sistema detectó el conflicto antes de cualquier cambio de estado.
Este escenario demuestra un patrón de calidad de producción: un fallo forzado en la prevalidación, una remediación guiada por lectura y un rastro de auditoría reproducible.
Por qué esto es importante
Los laboratorios regulados necesitan una custodia trazable y una remediación determinista cuando aparecen conflictos. Asset Core hace que la custodia sea autoritativa al tratar cada cambio como una transacción determinista y reproducible.
Modelo del sistema
- Estantes: contenedores de rejilla que imponen reglas de ocupación por laboratorio.
- Bahía del escáner: contenedor de ranura para verificaciones de custodia en vuelo.
- Grupos de reactivos: contenedores de equilibrio con cuantización de punto fijo.
- Clases y formas: registradas para que las reglas de colocación se mantengan consistentes.
- Unidades: celdas (fixed_point_scale=1000).
Flujo de trabajo en un vistazo
- Configuración - Registrar clases y crear contenedores de laboratorio.
- Semilla - Sembrar tubos iniciales y balances.
- Preflight Bloqueado - El preflight falla al colocar en una celda ocupada.
- Grid Free - Seleccione el siguiente ancla de cuadrícula disponible.
- Conciliar - Mueva el tubo del escáner a un ancla libre verificada.
- Verificar la cuadrícula - Confirmar la colocación reconciliada en la proyección de lectura.
Cómo leer la guía paso a paso
- Los pasos de una sola operación utilizan ayudantes de acción para mejorar la legibilidad.
- Los pasos de múltiples operaciones permanecen como llamadas de confirmación para preservar la atomicidad.
- Rust HTTP siempre utiliza el endpoint de commit con una o más operaciones.
Artefactos de escenario
- manifest.json - Metadatos y IDs del escenario.
- lab_chain_of_custody_actions.json - Cargas útiles de recorrido centradas en la acción.
- lab_chain_of_custody_transcript.json - Registro completo de solicitudes/respuestas.
- http_snapshot.json - Resultados de compromiso condensados.
- lab_chain_of_custody_steps.json - Índice de pasos determinísticos.
Última verificación
- ID de ejecución:
2026-01-19T18-52-12Z-lab_chain_of_custody - Estado: Aprobado
- Hash raíz de integridad:
efcb02df86d0dd2bb9ffd14d8a7403e52bd06b7c5f56fb4fc4f04703dc9f542f - Checks:
- {‘kind’: ‘invariantes estructurales’}: aprobado
- {‘kind’: ‘world_seq_monotonic’}: aprobado
- {‘kind’: ‘global_seq_monotonic’}: aprobado
{'kind': 'owner_scope', 'allowed_owners': [1, 2]}: aprobado{'kind': 'conservación_cantidad', 'container_id': 4, 'class_id': 2, 'stack_key': None, 'expected': 250000}: aprobado- {‘kind’: ‘replay_idempotent’}: pasado
{'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}: aprobado- {‘kind’: ‘runpack_integrity’}: aprobado
Descargas de Runpack
Instantánea del escenario
{
"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"
}
}
Fallo de rama
POSITION_OCCUPIED -> grid_free -> reconciliar movimiento
Registro de auditoría (opcional)
La transcripción captura los pares de solicitud y respuesta exactos emitidos durante la ejecución. Aquí hay un extracto compacto que puedes usar para validar el determinismo y la propagación de metadatos:
{
"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
}
}
Nota de pre-vuelo
- Las llamadas a la acción envían confirmaciones por defecto.
- Establezca ActionOptions(preflight=True) o llame a assetcore_commit_preflight para validación.
Configuración del SDK
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";Guía
Paso 1: Configuración
Registrar clases y crear contenedores de laboratorio.
Operaciones
- RegisterClass (x2) - Registra una definición de clase para que las operaciones futuras puedan hacer referencia a ella.
- RegisterClassShape - Registra una huella de forma de cuadrícula para una clase o variante de clase.
CreateContainer(x5) - Crea un contenedor (región de memoria estructurada) con el tipo solicitado.
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?;Paso 2: Semilla
Siembra tubos iniciales y balances.
Operaciones
AddInstance(x25) - Crea una nueva instancia y la coloca en una ubicación objetivo.AddFungible(x2) - Añade una cantidad fungible a un saldo o a una celda de cuadrícula explícita.
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?;Paso 3: Preflight Bloqueado (Error esperado)
La verificación previa falla al colocar en una celda ocupada.
Operaciones
- MoveInstance - Mueve una instancia existente a una nueva ubicación.
Error esperado
{
"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?;Paso 4: Sin Rejilla
Selecciona el siguiente ancla de cuadrícula disponible.
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?;Paso 5: Conciliar
Mueva el tubo del escáner a un ancla libre verificada.
Operaciones
- MoveInstance - Mueve una instancia existente a una nueva ubicación.
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?;Paso 6: Verificar la cuadrícula
Confirme la colocación reconciliada en la proyección de lectura.
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?;