Lab Cadena de Custòdia: Reconciliació Sota Auditoria
Sembrar un rack de laboratori a partir d’un manifest declaratiu, desencadenar un error de prevol determinista i reconciliar mitjançant una col·locació sense graella.
Si estàs llegint això en fred, aquest és un flux de treball de reconciliació de laboratori: seguiment de custòdia determinista, detecció de conflictes abans del vol i un moviment de remediació verificat. Cada canvi de custòdia és un compromís auditable perquè els investigadors puguin reproduir, verificar i explicar el que ha passat sense inferència.
El Problema: Pauses de Custòdia Sota Auditoria
Les cadenes de custòdia clíniques fallen quan l’inventari físic, els registres d’escàner i els sistemes operatius no coincideixen. Quan una col·locació falla, necessiteu proves deterministes que el sistema va detectar el conflicte abans de qualsevol canvi d’estat.
Aquest escenari demostra un patró de qualitat de producció: una fallada de prevol forçada, una remediació guiada per lectura i un rastre d’auditoria reproduïble.
Per què això és important
Els laboratoris regulats necessiten custòdia traçable i remediació determinista quan apareixen conflictes. Asset Core fa que la custòdia sigui autoritativa tractant cada canvi com una transacció determinista i reproduïble.
Model de sistema
- Racks: contenidors de graella que imposen regles d’ocupació per laboratori.
- Scanner bay: contenidor d’eslots per a comprovacions de custòdia en vol.
- Grups de reactius: contenidors de balanç amb quantització de punt fix.
- Classes i formes: registrades perquè les regles de col·locació es mantinguin coherents.
- Unitats: cel·les (fixed_point_scale=1000).
Visió general del flux de treball
- Configuració - Registrar classes i crear contenidors de laboratori.
- Semilla - Sembrar tubs inicials i equilibris.
- Preflight Bloquejat - El preflight falla quan es col·loca en una cel·la ocupada.
- Reixeta lliure - Seleccioneu l’ancoratge de reixeta disponible següent.
- Reconciliar - Mou el tub de l’escàner a un ancoratge lliure verificat.
- Verificar la reixeta - Confirmar la col·locació reconciliada en la projecció de lectura.
Com llegir la guia pas a pas
- Els passos d’una sola operació utilitzen helpers d’acció per a la llegibilitat.
- Els passos de múltiples operacions es mantenen com a crides de compromís per preservar l’atomicitat.
- Rust HTTP sempre utilitza el punt final de commit amb una o més operacions.
Artifacts de l’escenari
- manifest.json - Metadades i identificadors de l’escenari.
- lab_chain_of_custody_actions.json - Payloads de walkthrough amb accions prioritàries.
- lab_chain_of_custody_transcript.json - Registre complet de sol·licituds/respostes.
- http_snapshot.json - Resultats de compromís condensats.
- lab_chain_of_custody_steps.json - Índex de passos determinístics.
Última verificació
- ID d’execució:
2026-01-19T18-52-12Z-lab_chain_of_custody - Status: Aprovat
- Hash arrel d’integritat:
efcb02df86d0dd2bb9ffd14d8a7403e52bd06b7c5f56fb4fc4f04703dc9f542f - Checks:
- {‘kind’: ‘invariants estructurals’}: aprovat
- {‘kind’: ‘world_seq_monotonic’}: aprovat
- {‘kind’: ‘global_seq_monotonic’}: aprovat
{'kind': 'owner_scope', 'allowed_owners': [1, 2]}: aprovat{'kind': 'quantity_conservation', 'container_id': 4, 'class_id': 2, 'stack_key': None, 'expected': 250000}: aprovat- {‘kind’: ‘replay_idempotent’}: passat
{'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}: aprovat- {‘kind’: ‘runpack_integrity’}: aprovat
Descarregues de Runpack
Instantània de l’escenari
{
"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 -> reconciliar moviment
Audit trail (opcional)
La transcripció captura les parelles de sol·licitud i resposta exactes emeses durant l’execució. Aquí hi ha un extracte compacte que podeu utilitzar per validar el determinisme i la propagació de metadades:
{
"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 prevol
- Per defecte, les accions criden a enviar compromisos.
- Estableix ActionOptions(preflight=True) o crida assetcore_commit_preflight per a la validació.
SDK configuració
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";Guia
Pas 1: Configuració
Registreu classes i creeu contenidors de laboratori.
Operacions
- RegisterClass (x2) - Registra una definició de classe perquè les operacions futures la puguin referenciar.
- RegisterClassShape - Registra una empremta de forma de graella per a una classe o variant de classe.
CreateContainer(x5) - Crea un contenidor (regió de memòria estructurada) amb el tipus sol·licitat.
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?;Pas 2: Sembrar
Sembla que hi ha un error en la sol·licitud. No hi ha text per traduir. Si us plau, proporcioneu el text que voleu que tradueixi al català.
Operacions
AddInstance(x25) - Crea una nova instància i la col·loca en una ubicació objectiu.AddFungible(x2) - Afegeix una quantitat fungible a un saldo o a una cel·la de la graella 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?;Pas 3: Preflight Bloquejat (Error esperat)
El preflight falla quan s’intenta col·locar en una cel·la ocupada.
Operacions
- MoveInstance - Mou una instància existent a una nova ubicació.
Error esperat
{
"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?;Pas 4: Reixeta Lliure
Seleccioneu l’ancoratge de graella disponible següent.
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?;Pas 5: Reconciliar
Mou el tub d’escàner a un ancoratge lliure verificat.
Operacions
- MoveInstance - Mou una instància existent a una nova ubicació.
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?;Pas 6: Verificar la Xarxa
Confirmeu la col·locació reconciliada en la projecció 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?;