equipment.rpg.item

rpg.actor

Schema Diff

+210 -3

From

CID
bafyreie44w7flzo...
Indexed At
2026-04-06 03:50 UTC
View this version

To

CID
bafyreiduzwyrizq...
Indexed At
2026-10-09 12:54 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

4 breaking changes, 77 non-breaking changes.

Breaking Changes (4)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "equipment.rpg.item#fallback", src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.assetName", kind: "prop", name: Some("assetName") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "equipment.rpg.item#fallback", src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.asset", kind: "prop", name: Some("asset") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "equipment.rpg.item#channel", src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.name", kind: "prop", name: Some("name") }
  • KindChanged KindChanged { vertex_id: "equipment.rpg.item:body.stats", old_kind: "object", new_kind: "unknown" }
Non-Breaking Changes (77)
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#channel" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#channel.color" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#channel.defaultColor" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#channel.name" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#fallback" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#fallback.asset" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#fallback.assetName" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#fallback.colorway" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.classes" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.classes:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.layers" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.layers:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.categories" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.categories:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.classes" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.classes:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.layerClasses" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.layerClasses:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.behindRows" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.behindRows:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.bodyTypeAlt" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.channels" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.channels:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.colorway" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.fitClass" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.iconCid" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.submaskExclusions" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.submaskRule" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppress" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressAs" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressAsFallback" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressClasses" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressClasses:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressLayers" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressLayers:items" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.suppressSpecific" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.zSlot" }
  • AddedVertex AddedVertex { vertex_id: "equipment.rpg.item:body.zSlotByDir" }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.color", kind: "prop", name: Some("color") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.defaultColor", kind: "prop", name: Some("defaultColor") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.colorway", kind: "prop", name: Some("colorway") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions.classes", kind: "prop", name: Some("classes") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions.layers", kind: "prop", name: Some("layers") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#submaskExclusions.classes", tgt: "equipment.rpg.item#submaskExclusions.classes:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#submaskExclusions.layers", tgt: "equipment.rpg.item#submaskExclusions.layers:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.categories", kind: "prop", name: Some("categories") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.classes", kind: "prop", name: Some("classes") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.layerClasses", kind: "prop", name: Some("layerClasses") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules.categories", tgt: "equipment.rpg.item#suppressionRules.categories:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules.classes", tgt: "equipment.rpg.item#suppressionRules.classes:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item#suppressionRules.layerClasses", tgt: "equipment.rpg.item#suppressionRules.layerClasses:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.behindRows", kind: "prop", name: Some("behindRows") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.bodyTypeAlt", kind: "prop", name: Some("bodyTypeAlt") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.channels", kind: "prop", name: Some("channels") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.colorway", kind: "prop", name: Some("colorway") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.fitClass", kind: "prop", name: Some("fitClass") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.iconCid", kind: "prop", name: Some("iconCid") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.submaskExclusions", kind: "prop", name: Some("submaskExclusions") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.submaskRule", kind: "prop", name: Some("submaskRule") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppress", kind: "prop", name: Some("suppress") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressAs", kind: "prop", name: Some("suppressAs") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressAsFallback", kind: "prop", name: Some("suppressAsFallback") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressClasses", kind: "prop", name: Some("suppressClasses") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressLayers", kind: "prop", name: Some("suppressLayers") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressSpecific", kind: "prop", name: Some("suppressSpecific") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.zSlot", kind: "prop", name: Some("zSlot") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.behindRows", tgt: "equipment.rpg.item:body.behindRows:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.channels", tgt: "equipment.rpg.item:body.channels:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.channels:items", tgt: "equipment.rpg.item#channel", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.suppress", tgt: "equipment.rpg.item#suppressionRules", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.suppressAsFallback", tgt: "equipment.rpg.item#fallback", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.suppressClasses", tgt: "equipment.rpg.item:body.suppressClasses:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "equipment.rpg.item:body.suppressLayers", tgt: "equipment.rpg.item:body.suppressLayers:items", kind: "items", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "equipment.rpg.item#channel" }
  • AddedVertex { vertex_id: "equipment.rpg.item#channel.color" }
  • AddedVertex { vertex_id: "equipment.rpg.item#channel.defaultColor" }
  • AddedVertex { vertex_id: "equipment.rpg.item#channel.name" }
  • AddedVertex { vertex_id: "equipment.rpg.item#fallback" }
  • AddedVertex { vertex_id: "equipment.rpg.item#fallback.asset" }
  • AddedVertex { vertex_id: "equipment.rpg.item#fallback.assetName" }
  • AddedVertex { vertex_id: "equipment.rpg.item#fallback.colorway" }
  • AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions" }
  • AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.classes" }
  • AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.classes:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.layers" }
  • AddedVertex { vertex_id: "equipment.rpg.item#submaskExclusions.layers:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.categories" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.categories:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.classes" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.classes:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.layerClasses" }
  • AddedVertex { vertex_id: "equipment.rpg.item#suppressionRules.layerClasses:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.behindRows" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.behindRows:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.bodyTypeAlt" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.channels" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.channels:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.colorway" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.fitClass" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.iconCid" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.submaskExclusions" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.submaskRule" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppress" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressAs" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressAsFallback" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressClasses" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressClasses:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressLayers" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressLayers:items" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.suppressSpecific" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.zSlot" }
  • AddedVertex { vertex_id: "equipment.rpg.item:body.zSlotByDir" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "equipment.rpg.item#fallback", src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.assetName", kind: "prop", name: Some("assetName") }
  • Breaking: RequiredEdgeAdded { vertex_id: "equipment.rpg.item#fallback", src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.asset", kind: "prop", name: Some("asset") }
  • Breaking: RequiredEdgeAdded { vertex_id: "equipment.rpg.item#channel", src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.name", kind: "prop", name: Some("name") }
  • Breaking: KindChanged { vertex_id: "equipment.rpg.item:body.stats", old_kind: "object", new_kind: "unknown" }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.color", kind: "prop", name: Some("color") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#channel", tgt: "equipment.rpg.item#channel.defaultColor", kind: "prop", name: Some("defaultColor") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#fallback", tgt: "equipment.rpg.item#fallback.colorway", kind: "prop", name: Some("colorway") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions.classes", kind: "prop", name: Some("classes") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions.layers", kind: "prop", name: Some("layers") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#submaskExclusions.classes", tgt: "equipment.rpg.item#submaskExclusions.classes:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#submaskExclusions.layers", tgt: "equipment.rpg.item#submaskExclusions.layers:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.categories", kind: "prop", name: Some("categories") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.classes", kind: "prop", name: Some("classes") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules", tgt: "equipment.rpg.item#suppressionRules.layerClasses", kind: "prop", name: Some("layerClasses") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules.categories", tgt: "equipment.rpg.item#suppressionRules.categories:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules.classes", tgt: "equipment.rpg.item#suppressionRules.classes:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item#suppressionRules.layerClasses", tgt: "equipment.rpg.item#suppressionRules.layerClasses:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.behindRows", kind: "prop", name: Some("behindRows") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.bodyTypeAlt", kind: "prop", name: Some("bodyTypeAlt") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.channels", kind: "prop", name: Some("channels") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.colorway", kind: "prop", name: Some("colorway") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.fitClass", kind: "prop", name: Some("fitClass") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.iconCid", kind: "prop", name: Some("iconCid") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.submaskExclusions", kind: "prop", name: Some("submaskExclusions") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.submaskRule", kind: "prop", name: Some("submaskRule") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppress", kind: "prop", name: Some("suppress") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressAs", kind: "prop", name: Some("suppressAs") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressAsFallback", kind: "prop", name: Some("suppressAsFallback") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressClasses", kind: "prop", name: Some("suppressClasses") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressLayers", kind: "prop", name: Some("suppressLayers") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.suppressSpecific", kind: "prop", name: Some("suppressSpecific") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.zSlot", kind: "prop", name: Some("zSlot") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body", tgt: "equipment.rpg.item:body.zSlotByDir", kind: "prop", name: Some("zSlotByDir") }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.behindRows", tgt: "equipment.rpg.item:body.behindRows:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.channels", tgt: "equipment.rpg.item:body.channels:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.channels:items", tgt: "equipment.rpg.item#channel", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.submaskExclusions", tgt: "equipment.rpg.item#submaskExclusions", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.suppress", tgt: "equipment.rpg.item#suppressionRules", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.suppressAsFallback", tgt: "equipment.rpg.item#fallback", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.suppressClasses", tgt: "equipment.rpg.item:body.suppressClasses:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "equipment.rpg.item:body.suppressLayers", tgt: "equipment.rpg.item:body.suppressLayers:items", kind: "items", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "channel": {
5 +
      "properties": {
6 +
        "color": {
7 +
          "description": "Sentinel hex color in the colorway map.",
8 +
          "maxLength": 7,
9 +
          "type": "string"
10 +
        },
11 +
        "defaultColor": {
12 +
          "description": "Suggested default hex color for the color picker.",
13 +
          "maxLength": 7,
14 +
          "type": "string"
15 +
        },
16 +
        "name": {
17 +
          "description": "Channel identifier such as main, sub1, brim, or ribbon.",
18 +
          "maxLength": 20,
19 +
          "type": "string"
20 +
        }
21 +
      },
22 +
      "required": [
23 +
        "name"
24 +
      ],
25 +
      "type": "object"
26 +
    },
27 +
    "fallback": {
28 +
      "description": "Self-contained alternate artwork used for suppression or body-type adaptation.",
29 +
      "properties": {
30 +
        "asset": {
31 +
          "accept": [
32 +
            "image/png"
33 +
          ],
34 +
          "maxSize": 1000000,
35 +
          "type": "blob"
36 +
        },
37 +
        "assetName": {
38 +
          "maxLength": 120,
39 +
          "type": "string"
40 +
        },
41 +
        "colorway": {
42 +
          "accept": [
43 +
            "image/png"
44 +
          ],
45 +
          "maxSize": 1000000,
46 +
          "type": "blob"
47 +
        }
48 +
      },
49 +
      "required": [
50 +
        "assetName",
51 +
        "asset"
52 +
      ],
53 +
      "type": "object"
54 +
    },
4 55
    "main": {
5 56
      "description": "An item in the player's inventory. Self-contained with all data needed for rendering and display. The give URI and assetCid enable verification against the provider's attestation. Each record is one item.",
6 57
      "key": "any",
7 58
      "record": {
8 59
        "properties": {
9 60
          "acceptedAt": {
10 61
            "description": "When the player accepted this item.",
11 62
            "format": "datetime",
12 63
            "type": "string"
13 64
          },
14 65
          "asset": {
15 66
            "accept": [
16 67
              "image/png"
17 68
            ],
18 69
            "description": "The item's sprite layer artwork (144x192 PNG). Required for 'layer' items, optional for 'inventory' items.",
19 70
            "type": "blob"
20 71
          },
21 72
          "assetCid": {
22 -
            "description": "CID of the canonical asset or icon blob. Must match the give record's assetCid for verification.",
73 +
            "description": "CID of the canonical asset PNG, copied from the give. Matches the asset blob's ref when the copy is genuine.",
23 74
            "maxLength": 200,
24 75
            "type": "string"
25 76
          },
77 +
          "behindRows": {
78 +
            "description": "Sprite-sheet row indices (0-3) where this layer composites behind the body via destination-over blending. Row 0=down, 1=left, 2=right, 3=up. Omit for normal source-over on all rows.",
79 +
            "items": {
80 +
              "maximum": 3,
81 +
              "minimum": 0,
82 +
              "type": "integer"
83 +
            },
84 +
            "maxLength": 4,
85 +
            "type": "array"
86 +
          },
87 +
          "bodyTypeAlt": {
88 +
            "description": "Per-body-class alternate artwork map. Keys such as body.feminine map to structured fallbacks matching #fallback.",
89 +
            "type": "unknown"
90 +
          },
26 91
          "category": {
27 92
            "description": "Generator layer category for 'layer' items (e.g. 'tops', 'righthand'). Ignored for 'inventory' items.",
28 93
            "maxLength": 30,
29 94
            "type": "string"
30 95
          },
96 +
          "channels": {
97 +
            "description": "Color channels defined by this item's colorway. Each entry names a recolorable region and declares its sentinel color and optional default.",
98 +
            "items": {
99 +
              "ref": "#channel",
100 +
              "type": "ref"
101 +
            },
102 +
            "maxLength": 8,
103 +
            "type": "array"
104 +
          },
105 +
          "colorway": {
106 +
            "accept": [
107 +
              "image/png"
108 +
            ],
109 +
            "description": "Colorway map (_c) for the asset. A 144x192 PNG with sentinel-colored pixels indicating recolorable regions. Required for 'layer' items that support recoloring.",
110 +
            "type": "blob"
111 +
          },
31 112
          "context": {
32 113
            "description": "Origin description copied from the give record.",
33 114
            "maxLength": 200,
34 115
            "type": "string"
35 116
          },
36 117
          "description": {
37 118
            "description": "Flavour text or description.",
38 119
            "maxLength": 500,
39 120
            "type": "string"
40 121
          },
122 +
          "fitClass": {
123 +
            "description": "Fit-class tag for this item (format <category>.<name>) used by class-based suppression.",
124 +
            "maxLength": 90,
125 +
            "type": "string"
126 +
          },
41 127
          "give": {
42 128
            "description": "AT URI of the equipment.rpg.give record on the provider's PDS.",
43 129
            "format": "at-uri",
44 130
            "type": "string"
45 131
          },
46 132
          "icon": {
47 133
            "accept": [
48 134
              "image/png"
49 135
            ],
50 136
            "description": "Small standalone icon for the item (e.g. 64x64 PNG). Used in inventory displays and profile panels.",
51 137
            "type": "blob"
52 138
          },
139 +
          "iconCid": {
140 +
            "description": "CID of the canonical icon PNG, copied from the give. Matches the icon blob's ref when the copy is genuine. Omit if there's no icon.",
141 +
            "maxLength": 200,
142 +
            "type": "string"
143 +
          },
53 144
          "item": {
54 145
            "description": "Item identifier matching the give record (e.g. 'popcorn', 'theatre_shirt').",
55 146
            "maxLength": 50,
56 147
            "type": "string"
57 148
          },
58 149
          "kind": {
59 -
            "description": "Item kind. 'layer' for sprite-generator wearables, 'inventory' for non-wearable items like keys or potions. Defaults to 'layer' if omitted.",
150 +
            "description": "Item kind. 'layer' for sprite-generator wearables (requires category + asset). For non-wearable inventory items, use any descriptive type string such as 'badge', 'potion', 'map', 'key', 'ticket', etc. This value is shown as the item's type label in the player's inventory. Defaults to 'layer' if omitted.",
60 151
            "maxLength": 20,
61 152
            "type": "string"
62 153
          },
63 154
          "provider": {
64 155
            "description": "DID of the provider who gave this item.",
65 156
            "format": "did",
66 157
            "type": "string"
67 158
          },
68 159
          "stats": {
69 160
            "description": "Item properties copied from the give record at acceptance time.",
70 -
            "type": "object"
161 +
            "type": "unknown"
71 162
          },
163 +
          "submaskExclusions": {
164 +
            "description": "Target-side exceptions to submaskRule. The layers array contains exact canonical source layer IDs and the classes array contains exact source layerClass or fitClass values; matching source masks are skipped before submaskRule is evaluated. Omission or empty arrays means no source-specific exclusions.",
165 +
            "ref": "#submaskExclusions",
166 +
            "type": "ref"
167 +
          },
168 +
          "submaskRule": {
169 +
            "description": "Controls which external subtractive masks may affect this asset. Omission means respect-all.",
170 +
            "knownValues": [
171 +
              "respect-all",
172 +
              "ignore-all",
173 +
              "ignore-layers-above",
174 +
              "ignore-layers-below"
175 +
            ],
176 +
            "maxLength": 24,
177 +
            "type": "string"
178 +
          },
179 +
          "suppress": {
180 +
            "ref": "#suppressionRules",
181 +
            "type": "ref"
182 +
          },
183 +
          "suppressAs": {
184 +
            "description": "When this item is suppressed, render this same-category item name instead (e.g. replace pigtails with basic short).",
185 +
            "maxLength": 120,
186 +
            "type": "string"
187 +
          },
188 +
          "suppressAsFallback": {
189 +
            "description": "Self-contained artwork for suppressAs when the fallback is not otherwise available to the generator.",
190 +
            "ref": "#fallback",
191 +
            "type": "ref"
192 +
          },
193 +
          "suppressClasses": {
194 +
            "description": "Fit-class identifiers that should be hidden while this item is equipped (e.g. hide all items tagged hair.*).",
195 +
            "items": {
196 +
              "maxLength": 90,
197 +
              "type": "string"
198 +
            },
199 +
            "maxLength": 20,
200 +
            "type": "array"
201 +
          },
202 +
          "suppressLayers": {
203 +
            "description": "Layer IDs that should be hidden while this item is equipped (e.g. a hat suppressing hair and bangs).",
204 +
            "items": {
205 +
              "maxLength": 30,
206 +
              "type": "string"
207 +
            },
208 +
            "maxLength": 20,
209 +
            "type": "array"
210 +
          },
211 +
          "suppressSpecific": {
212 +
            "description": "Per-suppressor override map. Values may be a structured #fallback or a rule with default and bodyTypeAlt fallbacks. The active body-specific value takes priority over the class default, then suppressAs.",
213 +
            "type": "unknown"
214 +
          },
72 215
          "title": {
73 216
            "description": "Display name for the item.",
74 217
            "maxLength": 100,
75 218
            "type": "string"
219 +
          },
220 +
          "zSlot": {
221 +
            "description": "Legacy all-direction draw-order slot. zSlotByDir takes precedence.",
222 +
            "maximum": 30,
223 +
            "minimum": 0,
224 +
            "type": "integer"
225 +
          },
226 +
          "zSlotByDir": {
227 +
            "description": "Per-direction draw-order slots [down, left, right, up]. Entries are non-negative integers or null when the category default applies.",
228 +
            "type": "unknown"
76 229
          }
77 230
        },
78 231
        "required": [
79 232
          "item",
80 233
          "title",
81 234
          "give",
82 235
          "provider",
83 236
          "acceptedAt"
84 237
        ],
85 238
        "type": "object"
86 239
      },
87 240
      "type": "record"
241 +
    },
242 +
    "submaskExclusions": {
243 +
      "description": "Target-side exceptions for subtractive masks. List exact canonical source layer IDs in layers, or exact source layerClass or fitClass values in classes; matching source masks must not erase the target item. Omission or empty arrays means no source-specific exclusions.",
244 +
      "properties": {
245 +
        "classes": {
246 +
          "description": "Exact source layerClass or fitClass values whose subtractive masks must be skipped.",
247 +
          "items": {
248 +
            "maxLength": 90,
249 +
            "type": "string"
250 +
          },
251 +
          "maxLength": 64,
252 +
          "type": "array"
253 +
        },
254 +
        "layers": {
255 +
          "description": "Exact canonical source layer IDs whose subtractive masks must be skipped.",
256 +
          "items": {
257 +
            "maxLength": 30,
258 +
            "type": "string"
259 +
          },
260 +
          "maxLength": 32,
261 +
          "type": "array"
262 +
        }
263 +
      },
264 +
      "type": "object"
265 +
    },
266 +
    "suppressionRules": {
267 +
      "description": "Layer categories and fit classes hidden while this item is active.",
268 +
      "properties": {
269 +
        "categories": {
270 +
          "items": {
271 +
            "maxLength": 30,
272 +
            "type": "string"
273 +
          },
274 +
          "maxLength": 20,
275 +
          "type": "array"
276 +
        },
277 +
        "classes": {
278 +
          "items": {
279 +
            "maxLength": 90,
280 +
            "type": "string"
281 +
          },
282 +
          "maxLength": 20,
283 +
          "type": "array"
284 +
        },
285 +
        "layerClasses": {
286 +
          "items": {
287 +
            "maxLength": 90,
288 +
            "type": "string"
289 +
          },
290 +
          "maxLength": 20,
291 +
          "type": "array"
292 +
        }
293 +
      },
294 +
      "type": "object"
88 295
    }
89 296
  },
90 297
  "description": "A player's owned item, accepted from a provider's give record. Lives on the player's PDS.",
91 298
  "id": "equipment.rpg.item",
92 299
  "lexicon": 1
93 300
}

Compare Other Versions

Lexicon Garden

@