@wowok/skills 1.1.13 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -2
- package/examples/Insurance/Insurance.md +309 -72
- package/examples/MyShop/MyShop.md +169 -39
- package/examples/MyShop_Advanced/MyShop_Advanced.md +415 -49
- package/examples/ThreeBody_Signature/ThreeBody_Signature.md +200 -18
- package/examples/Travel/Travel.md +234 -59
- package/package.json +1 -1
- package/wowok-guard/SKILL.md +192 -1
- package/wowok-machine/SKILL.md +72 -0
- package/wowok-order/APPENDIX.md +33 -33
- package/wowok-provider/SKILL.md +26 -12
- package/wowok-scenario/SKILL.md +10 -0
- package/wowok-tools/SKILL.md +2 -2
|
@@ -4,6 +4,24 @@ A complete example demonstrating how to create a service for book signing by the
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## ⚠️ Running Principle
|
|
8
|
+
|
|
9
|
+
> **Run the example in full every time (repeatable).** This example uses `replaceExistName: true` on all object creations — each run generates new objects with new addresses. If you skip build steps, operations may silently act on orphaned objects from previous runs, producing incorrect results. Old objects' configurations do not reflect the current document version.
|
|
10
|
+
|
|
11
|
+
- **Execution order**: Run all build/setup steps (including account generation) in sequence before testing any customer order flow. Do not skip steps — each depends on objects created by prior steps.
|
|
12
|
+
- **Prerequisites**: `three_body_author` and `three_body_customer` with sufficient WOW for gas (≥ 1000 WOW recommended). All on-chain operations require `env.confirmed: true`.
|
|
13
|
+
|
|
14
|
+
### 🔐 Two-Step Confirmation Flow (Production Safety)
|
|
15
|
+
|
|
16
|
+
This example sets `env.confirmed: true` on irreversible operations (e.g., `publish: true` on Machine) for brevity. In real deployments, follow the two-step flow enforced by the ConfirmGate safety layer:
|
|
17
|
+
|
|
18
|
+
1. **Phase 1 — Preview**: Call the tool **without** `env.confirmed`. The server returns `{ status: "pending_confirmation", confirmation_text: "..." }` containing the full operation summary, risk assessment, and irreversible-action warnings.
|
|
19
|
+
2. **Phase 2 — Confirm**: Review `confirmation_text` with the user. Only after explicit user approval, call the tool again **with** `env.confirmed: true` to actually execute the on-chain transaction.
|
|
20
|
+
|
|
21
|
+
> Skipping Phase 1 means the user never sees the risk summary before gas is spent. Always preview first, then confirm. This is especially critical for the `publish: true` step on the ThreeBody Machine (Step 4 in Part 2), which is an irreversible lock of the `machine` and `order_allocators` fields.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
7
25
|
## Overview
|
|
8
26
|
|
|
9
27
|
This example demonstrates:
|
|
@@ -208,10 +226,10 @@ Create a Guard that verifies the buyer is the service creator (author). This ens
|
|
|
208
226
|
"data": {
|
|
209
227
|
"namedNew": {
|
|
210
228
|
"name": "three_body_buy_guard",
|
|
211
|
-
"tags": ["signature", "book", "buy-guard"],
|
|
229
|
+
"tags": ["signature", "book", "buy-guard", "level1-strict"],
|
|
212
230
|
"replaceExistName": true
|
|
213
231
|
},
|
|
214
|
-
"description": "Verify buyer is the service creator (three_body_author). Only the author can purchase this signature service.",
|
|
232
|
+
"description": "Verify buyer is the service creator (three_body_author). Only the author can purchase this signature service. VERIFIER CONSTRAINT LEVEL 1 (strict single-identity binding): The author role is permanently tied to a single address. The designer explicitly accepts the lock-in risk because (a) the author is the sole service operator in this minimal example, and (b) Guard immutability guarantees the buyer whitelist cannot be tampered with. R-C4-04 (info): if the author address is lost or rotated, the Guard must be rebuilt and the Service's buy_guard must be re-bound.",
|
|
215
233
|
"table": [
|
|
216
234
|
{
|
|
217
235
|
"identifier": 0,
|
|
@@ -245,6 +263,8 @@ Create a Guard that verifies the buyer is the service creator (author). This ens
|
|
|
245
263
|
|
|
246
264
|
> **Note**: The Guard uses a `table` to define constant values with identifiers, then references them in the `root` logic using `identifier` node type. The `root` is a direct GuardNode (no wrapper).
|
|
247
265
|
|
|
266
|
+
> **⚠️ Level 1 — Strict Single-Identity Binding (R-C4-04)**: This Guard uses `logic_equal[context(Signer), identifier[0](three_body_author)]` — the strictest verifier constraint level. Only the single fixed author address can pass. The lock-in risk is acceptable here because: (1) the author is the sole operator of this signature service, (2) Guard immutability guarantees the whitelist cannot be tampered with, and (3) the buy_guard can be re-bound on the Service if the author address ever needs rotation (the old Guard is abandoned and a new one is created). For multi-operator scenarios, prefer Level 2 (identity-set binding) instead.
|
|
267
|
+
|
|
248
268
|
> **Important**: `env.confirmed: true` is required because `replaceExistName: true` triggers a confirmation prompt.
|
|
249
269
|
|
|
250
270
|
**Expected Result**:
|
|
@@ -507,9 +527,151 @@ Configure the Buy Guard to restrict purchases to the author only.
|
|
|
507
527
|
|
|
508
528
|
---
|
|
509
529
|
|
|
530
|
+
## Step 6.5: Create Treasury Object
|
|
531
|
+
|
|
532
|
+
Create a Treasury object to aggregate signature service revenue (public funds for the author's operational distribution). The Treasury uses the same Permission as the Service (`three_body_permission`) — this ensures a single consistent permission organization governs both fund collection and service operations.
|
|
533
|
+
|
|
534
|
+
**Request**:
|
|
535
|
+
```json
|
|
536
|
+
{
|
|
537
|
+
"operation_type": "treasury",
|
|
538
|
+
"data": {
|
|
539
|
+
"object": {
|
|
540
|
+
"name": "three_body_treasury",
|
|
541
|
+
"type_parameter": "0x2::wow::WOW",
|
|
542
|
+
"permission": "three_body_permission",
|
|
543
|
+
"replaceExistName": true
|
|
544
|
+
},
|
|
545
|
+
"description": "Treasury for aggregating Three-Body signature service revenue (author's public funds for operations and distribution). Uses the same Permission as the Service (three_body_permission) for consistency — a single permission organization governs both fund collection and service operations."
|
|
546
|
+
},
|
|
547
|
+
"env": {
|
|
548
|
+
"account": "three_body_author",
|
|
549
|
+
"network": "testnet",
|
|
550
|
+
"confirmed": true
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
> **Treasury-First Rule**: Following the fund-flow design pattern established in the Insurance, MyShop_Advanced, and Travel examples, merchant revenue flows to `three_body_treasury` (not directly to the author's address or the Service address). This:
|
|
556
|
+
> 1. **Aggregates public funds** for the author's operational distribution and accounting
|
|
557
|
+
> 2. **Makes allocators inherently safe** (R-C3-06) — funds always flow to the fixed Treasury regardless of caller, so no Signer binding is needed in the allocator Guard
|
|
558
|
+
> 3. **Uses permission consistency** — Treasury and Service share `three_body_permission`, ensuring unified governance
|
|
559
|
+
|
|
560
|
+
> **Important**: `env.confirmed: true` is required because `replaceExistName: true` triggers a confirmation prompt.
|
|
561
|
+
|
|
562
|
+
**Expected Result**:
|
|
563
|
+
```json
|
|
564
|
+
[
|
|
565
|
+
{
|
|
566
|
+
"type": "Treasury",
|
|
567
|
+
"type_raw": "0x2::treasury::Treasury<0x2::wow::WOW>",
|
|
568
|
+
"object": "0x...",
|
|
569
|
+
"version": "...",
|
|
570
|
+
"owner": {"Shared": {"initial_shared_version": "..."}},
|
|
571
|
+
"change": "created"
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
"type": "TableItem_EntityLinker",
|
|
575
|
+
"type_raw": "0x2::dynamic_field::Field<address, 0x2::registrar::Votes>",
|
|
576
|
+
"object": "0x...",
|
|
577
|
+
"version": "...",
|
|
578
|
+
"owner": {"ObjectOwner": "0x0000000000000000000000000000000000000000000000000000000000000aaa"},
|
|
579
|
+
"change": "created"
|
|
580
|
+
}
|
|
581
|
+
]
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
## Step 6.6: Create Allocator Guard
|
|
587
|
+
|
|
588
|
+
Create a dedicated Guard for the order allocator that verifies the order belongs to this service. This is a **Level 3 scene-combined** Guard: no Signer binding is needed because the allocator uses `sharing.who=Entity(three_body_treasury)` — funds always flow to the fixed Treasury regardless of who triggers the allocation.
|
|
589
|
+
|
|
590
|
+
**Guard Logic**:
|
|
591
|
+
```
|
|
592
|
+
order.service == three_body_signature_service
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
**Request**:
|
|
596
|
+
```json
|
|
597
|
+
{
|
|
598
|
+
"operation_type": "guard",
|
|
599
|
+
"data": {
|
|
600
|
+
"namedNew": {
|
|
601
|
+
"name": "three_body_allocator_guard",
|
|
602
|
+
"tags": ["signature", "book", "allocator", "level3-scene-combined"],
|
|
603
|
+
"replaceExistName": true
|
|
604
|
+
},
|
|
605
|
+
"description": "Allocator guard for Three-Body signature service: verifies order.service == three_body_signature_service to prevent cross-service theft (R-C3-05). VERIFIER CONSTRAINT LEVEL 3 (scene-combined): No Signer binding needed because the allocator uses sharing.who=Entity(three_body_treasury) — funds always flow to the Treasury regardless of caller (R-C3-06 safe).",
|
|
606
|
+
"table": [
|
|
607
|
+
{
|
|
608
|
+
"identifier": 0,
|
|
609
|
+
"b_submission": true,
|
|
610
|
+
"value_type": "Address",
|
|
611
|
+
"name": "Order ID (submitted at runtime)"
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"identifier": 1,
|
|
615
|
+
"b_submission": false,
|
|
616
|
+
"value_type": "Address",
|
|
617
|
+
"value": "three_body_signature_service",
|
|
618
|
+
"name": "Service address (this service)"
|
|
619
|
+
}
|
|
620
|
+
],
|
|
621
|
+
"root": {
|
|
622
|
+
"type": "logic_equal",
|
|
623
|
+
"nodes": [
|
|
624
|
+
{
|
|
625
|
+
"type": "query",
|
|
626
|
+
"query": "order.service",
|
|
627
|
+
"object": {"identifier": 0},
|
|
628
|
+
"parameters": []
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
"type": "identifier",
|
|
632
|
+
"identifier": 1
|
|
633
|
+
}
|
|
634
|
+
]
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
"env": {
|
|
638
|
+
"account": "three_body_author",
|
|
639
|
+
"network": "testnet",
|
|
640
|
+
"confirmed": true
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
**Guard Explanation (Service Ownership Check — Level 3 Scene-Combined):**
|
|
646
|
+
- **Table Item 0**: Order address (submitted at runtime, `b_submission: true`) — the order being allocated
|
|
647
|
+
- **Table Item 1**: Constant address `three_body_signature_service` (this service's on-chain address)
|
|
648
|
+
- **Root**: `logic_equal[query("order.service"), identifier[1]]` — verifies the submitted Order's `service` field equals `three_body_signature_service`
|
|
649
|
+
|
|
650
|
+
> **Risk Elimination (R-C3-05 + R-C3-06) — Level 3 Scene-Combined Design**:
|
|
651
|
+
> - **R-C3-05 (Cross-service theft)**: Eliminated by the Service Ownership check. An attacker cannot submit another service's order because `order.service` won't match `three_body_signature_service`.
|
|
652
|
+
> - **R-C3-06 (Fund theft via Signer)**: Eliminated by the scene itself — the allocator uses `"who": {"Entity": {"name_or_address": "three_body_treasury"}}` (funds flow to the fixed Treasury address). Funds go to a fixed recipient regardless of caller, so **no Signer binding is needed**. This is the Level 3 scene-combined pattern.
|
|
653
|
+
|
|
654
|
+
> **Important**: `env.confirmed: true` is required because `replaceExistName: true` triggers a confirmation prompt.
|
|
655
|
+
|
|
656
|
+
**Expected Result**:
|
|
657
|
+
```json
|
|
658
|
+
[
|
|
659
|
+
{
|
|
660
|
+
"type": "Guard",
|
|
661
|
+
"type_raw": "0x2::guard::Guard",
|
|
662
|
+
"object": "0x...",
|
|
663
|
+
"version": "...",
|
|
664
|
+
"owner": "Immutable",
|
|
665
|
+
"change": "created"
|
|
666
|
+
}
|
|
667
|
+
]
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
---
|
|
671
|
+
|
|
510
672
|
## Step 7: Configure Order Allocators
|
|
511
673
|
|
|
512
|
-
Set up fund allocation: 100% to the author upon order completion.
|
|
674
|
+
Set up fund allocation: 100% to the author's Treasury upon order completion.
|
|
513
675
|
|
|
514
676
|
**Request**:
|
|
515
677
|
```json
|
|
@@ -518,15 +680,15 @@ Set up fund allocation: 100% to the author upon order completion.
|
|
|
518
680
|
"data": {
|
|
519
681
|
"object": "three_body_signature_service",
|
|
520
682
|
"order_allocators": {
|
|
521
|
-
"description": "Three-Body signature service fund allocation - 100% to author",
|
|
683
|
+
"description": "Three-Body signature service fund allocation - 100% to author Treasury",
|
|
522
684
|
"threshold": 0,
|
|
523
685
|
"allocators": [
|
|
524
686
|
{
|
|
525
|
-
"guard": "
|
|
687
|
+
"guard": "three_body_allocator_guard",
|
|
526
688
|
"sharing": [
|
|
527
689
|
{
|
|
528
690
|
"who": {
|
|
529
|
-
"
|
|
691
|
+
"Entity": {"name_or_address": "three_body_treasury"}
|
|
530
692
|
},
|
|
531
693
|
"sharing": 10000,
|
|
532
694
|
"mode": "Rate"
|
|
@@ -544,6 +706,11 @@ Set up fund allocation: 100% to the author upon order completion.
|
|
|
544
706
|
}
|
|
545
707
|
```
|
|
546
708
|
|
|
709
|
+
> **⚠️ Risk Elimination — Why this configuration is safe**:
|
|
710
|
+
> - **R-C3-05 (Cross-service theft)**: Eliminated by `three_body_allocator_guard` (Step 6.6), which verifies `order.service == three_body_signature_service` before allocation proceeds.
|
|
711
|
+
> - **R-C3-06 (Fund theft via Signer)**: Eliminated by `sharing.who = {"Entity": {"name_or_address": "three_body_treasury"}}` — funds always flow to the fixed Treasury address regardless of who triggers the allocation. An attacker cannot redirect funds to themselves even if they somehow bypass the Guard.
|
|
712
|
+
> - **Previous unsafe pattern (DO NOT USE)**: The original design used `guard: "three_body_buy_guard"` (no `order.service` check) with `sharing.who = {"Signer": "signer"}` — this allowed anyone to trigger allocation of any order's funds to themselves.
|
|
713
|
+
|
|
547
714
|
**Expected Result**:
|
|
548
715
|
```json
|
|
549
716
|
[
|
|
@@ -697,14 +864,14 @@ Query the service to verify all configurations.
|
|
|
697
864
|
"paused_time": null,
|
|
698
865
|
"setting_lock_duration": "2592000000",
|
|
699
866
|
"order_allocators": {
|
|
700
|
-
"description": "Three-Body signature service fund allocation - 100% to author",
|
|
867
|
+
"description": "Three-Body signature service fund allocation - 100% to author Treasury",
|
|
701
868
|
"threshold": "0",
|
|
702
869
|
"allocators": [
|
|
703
870
|
{
|
|
704
871
|
"guard": "0x...",
|
|
705
872
|
"sharing": [
|
|
706
873
|
{
|
|
707
|
-
"who": {"
|
|
874
|
+
"who": {"Entity": "0x..."},
|
|
708
875
|
"sharing": "10000",
|
|
709
876
|
"mode": 1
|
|
710
877
|
}
|
|
@@ -729,7 +896,8 @@ Query the service to verify all configurations.
|
|
|
729
896
|
> **Field Reference**:
|
|
730
897
|
> - **`buy_guard`**, **`machine`**, **`permission`**: Return **on-chain object IDs** (not names). The on-chain data stores raw object IDs; resolving them back to local mark names requires a separate reverse lookup that is not performed by `onchain_objects` queries.
|
|
731
898
|
> - **`query_name`**: The original name string passed in the query request (here, `"three_body_signature_service"`). This is automatically populated by the SDK from the input `objects` array, so you can identify which queried name corresponds to which returned object.
|
|
732
|
-
> - **`order_allocators.allocators[].
|
|
899
|
+
> - **`order_allocators.allocators[].guard`**: Returns the on-chain object ID of `three_body_allocator_guard` (created in Step 6.6). This Guard verifies `order.service == three_body_signature_service` (R-C3-05 protection).
|
|
900
|
+
> - **`order_allocators.allocators[].sharing[].who`**: `{"Entity": "0x..."}` indicates funds flow to the fixed Treasury object (`three_body_treasury` from Step 6.5). The address is the Treasury's on-chain object ID. This eliminates R-C3-06 (fund theft via Signer) because the recipient is fixed regardless of caller.
|
|
733
901
|
> - **`order_allocators.allocators[].sharing[].mode`**: `1` is the numeric enum for `Rate` mode (input accepts the string `"Rate"`, output returns the numeric `1`).
|
|
734
902
|
> - **`order_allocators.allocators[].fix`** and **`max`**: Additional fields returned on-chain (default `"0"` and `null` respectively) that are not part of the input schema but are present in the on-chain data structure.
|
|
735
903
|
|
|
@@ -1020,23 +1188,34 @@ The author completes the signature.
|
|
|
1020
1188
|
|
|
1021
1189
|
This example demonstrates:
|
|
1022
1190
|
|
|
1023
|
-
1. **Buy Guard Implementation**: Restricts service purchases to specific accounts
|
|
1191
|
+
1. **Buy Guard Implementation**: Restricts service purchases to specific accounts (Level 1 strict single-identity binding)
|
|
1024
1192
|
2. **Machine Workflow**: Two-node process for service delivery tracking
|
|
1025
1193
|
3. **WIP Files Optional**: Sales items can use WIP files or empty strings
|
|
1026
1194
|
4. **Service Configuration**: Complete setup from creation to publication
|
|
1195
|
+
5. **Safe Fund Allocation**: Treasury-first design with Level 3 scene-combined allocator Guard — funds always flow to the fixed Treasury, eliminating R-C3-05 (cross-service theft) and R-C3-06 (fund theft via Signer)
|
|
1027
1196
|
|
|
1028
1197
|
### Key Objects
|
|
1029
1198
|
|
|
1030
1199
|
| Object | Name |
|
|
1031
1200
|
|--------|------|
|
|
1032
1201
|
| Permission | three_body_permission |
|
|
1033
|
-
| Buy Guard | three_body_buy_guard |
|
|
1202
|
+
| Buy Guard | three_body_buy_guard (Level 1 strict, R-C4-04) |
|
|
1034
1203
|
| Machine | three_body_machine |
|
|
1035
1204
|
| Service | three_body_signature_service |
|
|
1205
|
+
| Treasury | three_body_treasury |
|
|
1206
|
+
| Allocator Guard | three_body_allocator_guard (Level 3 scene-combined, R-C3-05/R-C3-06 safe) |
|
|
1036
1207
|
| Order | three_body_order |
|
|
1037
1208
|
| Allocation | three_body_allocation |
|
|
1038
1209
|
| Progress | three_body_progress |
|
|
1039
1210
|
|
|
1211
|
+
### Risk Mitigation Summary
|
|
1212
|
+
|
|
1213
|
+
| Risk | Severity | Mitigation |
|
|
1214
|
+
|------|----------|------------|
|
|
1215
|
+
| **R-C3-05** (Cross-service theft) | High | `three_body_allocator_guard` verifies `order.service == three_body_signature_service` before allocation |
|
|
1216
|
+
| **R-C3-06** (Fund theft via Signer) | Critical | `sharing.who = {"Entity": {"name_or_address": "three_body_treasury"}}` — funds flow to fixed Treasury, no Signer binding needed |
|
|
1217
|
+
| **R-C4-04** (Level 1 lock-in) | Info | Buy Guard uses Level 1 strict binding (justified: sole-operator service, buy_guard can be re-bound if author rotates) |
|
|
1218
|
+
|
|
1040
1219
|
---
|
|
1041
1220
|
|
|
1042
1221
|
## Design Notes
|
|
@@ -1071,19 +1250,22 @@ Each node transition requires the author's confirmation, ensuring accountability
|
|
|
1071
1250
|
- Permission first (foundation)
|
|
1072
1251
|
- Machine (create workflow before service)
|
|
1073
1252
|
- Service (unpublished)
|
|
1074
|
-
- Guards (
|
|
1075
|
-
-
|
|
1253
|
+
- Guards (Buy Guard for purchase control; Allocator Guard needs Service address for `order.service` verification)
|
|
1254
|
+
- Treasury (uses same Permission as Service for unified governance)
|
|
1255
|
+
- Configure Service (add machine, buy_guard, order_allocators with allocator guard + Entity(Treasury))
|
|
1076
1256
|
- Publish Service (LAST - once published, many changes are blocked)
|
|
1077
1257
|
|
|
1078
|
-
3. **
|
|
1258
|
+
3. **Treasury-First Fund Flow**: Always route merchant revenue through a Treasury object using `sharing.who = {"Entity": {"name_or_address": "treasury_name"}}` instead of `{"Signer": "signer"}`. This eliminates R-C3-06 (critical fund theft via Signer) because funds flow to a fixed recipient regardless of who triggers the allocation. Combined with an allocator Guard that verifies `order.service == this_service` (R-C3-05 protection), the fund allocation becomes inherently safe.
|
|
1259
|
+
|
|
1260
|
+
4. **Use `confirmed: true` for Irreversible/Destructive Operations**: The MCP server enforces a two-phase confirmation for safety. You MUST add `"confirmed": true` to the `env` for:
|
|
1079
1261
|
- Any operation using `replaceExistName: true` (unbinds existing names)
|
|
1080
1262
|
- Any `publish: true` operation (irreversible lock on Machine/Service)
|
|
1081
1263
|
Without `confirmed: true`, the server returns a `Confirmation required` warning and blocks the transaction.
|
|
1082
1264
|
|
|
1083
|
-
|
|
1265
|
+
5. **Use `no_cache: true` for Sequential Operations**: When performing multiple operations on the same object in sequence (especially Progress workflow advancement), always set `no_cache: true` in the `env` to ensure the SDK reads the latest on-chain state.
|
|
1084
1266
|
|
|
1085
|
-
|
|
1267
|
+
6. **Query Toolkit is Your Best Friend**: Use queries constantly to verify objects exist, check configurations, debug issues, and confirm state changes.
|
|
1086
1268
|
|
|
1087
|
-
|
|
1269
|
+
7. **Object IDs vs Names in Responses**: On-chain query responses return **object IDs** (e.g., `0x8202...`) for cross-object references like `buy_guard`, `machine`, `permission`. The `query_name` field in the response echoes back the original query input name. To resolve object IDs back to local mark names, use `query_toolkit` with `query_type: "local_names"`.
|
|
1088
1270
|
|
|
1089
|
-
|
|
1271
|
+
8. **Information Injection in Transaction Responses**: Mutation/creation operations return ALL objects affected by the transaction (including side effects like `TableItem_EntityLinker` and `TableItem_ProgressHistory`), not just the primary target. This is a deliberate design for transparency. The return order reflects the transaction's execution order.
|