games.atmosphere.define

atmosphere.games

Schema Diff

+104 -350

From

CID
bafyreif5i4hkn7z...
Indexed At
2026-07-18 02:43 UTC
View this version

To

CID
bafyreigaymudihd...
Indexed At
2026-07-20 03:53 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

98 breaking changes, 9 non-breaking changes.

Breaking Changes (98)
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.key", kind: "prop", name: Some("key") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.path", kind: "prop", name: Some("path") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.label", kind: "prop", name: Some("label") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#lexiconRef", src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.nsid", kind: "prop", name: Some("nsid") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#reference", src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.role", kind: "prop", name: Some("role") }
  • RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#reference", src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.nsid", kind: "prop", name: Some("nsid") }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#field.valueBoolean" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#field.valueInteger" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#field.valueString" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueBoolean" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueInteger" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueString" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.acquire" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.nsid" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.purpose" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.verify" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#recordUse.display" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#recordUse.display:items" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.acquire" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.authority" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.display" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.display:items" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.filters" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.filters:items" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.label" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.nsid" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.path" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.purpose" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.rkey" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.role" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#reference.verify" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.aggregate" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.divideBy" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.format" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.key" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.label" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.maximumFractionDigits" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.multiplyBy" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.path" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.priority" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.unit" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueBoolean" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueInteger" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueString" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.includes" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.includes:items" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.references" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.references:items" }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueInteger", kind: "prop", name: Some("valueInteger") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueString", kind: "prop", name: Some("valueString") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueInteger", kind: "prop", name: Some("valueInteger") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueString", kind: "prop", name: Some("valueString") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.acquire", kind: "prop", name: Some("acquire") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.purpose", kind: "prop", name: Some("purpose") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.verify", kind: "prop", name: Some("verify") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#lexiconRef.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.display", kind: "prop", name: Some("display") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#recordUse.display", tgt: "games.atmosphere.define#recordUse.display:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#recordUse.display:items", tgt: "games.atmosphere.define#referenceDisplay", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.acquire", kind: "prop", name: Some("acquire") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.authority", kind: "prop", name: Some("authority") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.display", kind: "prop", name: Some("display") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.filters", kind: "prop", name: Some("filters") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.label", kind: "prop", name: Some("label") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.path", kind: "prop", name: Some("path") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.purpose", kind: "prop", name: Some("purpose") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.rkey", kind: "prop", name: Some("rkey") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.verify", kind: "prop", name: Some("verify") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference.display", tgt: "games.atmosphere.define#reference.display:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference.display:items", tgt: "games.atmosphere.define#referenceDisplay", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference.filters", tgt: "games.atmosphere.define#reference.filters:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference.filters:items", tgt: "games.atmosphere.define#filter", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#reference.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.aggregate", kind: "prop", name: Some("aggregate") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.divideBy", kind: "prop", name: Some("divideBy") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.format", kind: "prop", name: Some("format") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.maximumFractionDigits", kind: "prop", name: Some("maximumFractionDigits") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.multiplyBy", kind: "prop", name: Some("multiplyBy") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.priority", kind: "prop", name: Some("priority") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.unit", kind: "prop", name: Some("unit") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueInteger", kind: "prop", name: Some("valueInteger") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueString", kind: "prop", name: Some("valueString") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.includes", kind: "prop", name: Some("includes") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.references", kind: "prop", name: Some("references") }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body.includes", tgt: "games.atmosphere.define:body.includes:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body.includes:items", tgt: "games.atmosphere.define#lexiconRef", kind: "ref", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body.references", tgt: "games.atmosphere.define:body.references:items", kind: "items", name: None }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body.references:items", tgt: "games.atmosphere.define#reference", kind: "ref", name: None }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#recordUse.role", sort: "knownValues", old_value: "[\"perk\",\"character\",\"cosmetic\",\"bonus\",\"interoperability\",\"stats\",\"activity\",\"leaderboard\",\"save\",\"replay\",\"session\",\"profile\",\"inventory\",\"grant\",\"validation\",\"label\",\"other\"]", new_value: "[\"character\",\"perk\",\"cosmetic\",\"interop\",\"stats\",\"activity\",\"leaderboard\",\"profile\",\"session\",\"inventory\",\"other\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#filter.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#rule.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#field.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }
Non-Breaking Changes (9)
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#field.value" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#filter.value" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#rule.value" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#rule.verify" }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.value", kind: "prop", name: Some("value") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.value", kind: "prop", name: Some("value") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.value", kind: "prop", name: Some("value") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.verify", kind: "prop", name: Some("verify") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#rule.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }

Migration Guidance

Removed Elements

  • RemovedVertex { vertex_id: "games.atmosphere.define#field.valueBoolean" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#field.valueInteger" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#field.valueString" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueBoolean" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueInteger" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#filter.valueString" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.acquire" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.nsid" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.purpose" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#lexiconRef.verify" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#recordUse.display" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#recordUse.display:items" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.acquire" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.authority" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.display" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.display:items" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.filters" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.filters:items" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.label" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.nsid" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.path" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.purpose" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.rkey" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.role" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#reference.verify" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.aggregate" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.divideBy" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.format" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.key" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.label" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.maximumFractionDigits" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.multiplyBy" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.path" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.priority" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#referenceDisplay.unit" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueBoolean" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueInteger" }
  • RemovedVertex { vertex_id: "games.atmosphere.define#rule.valueString" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.includes" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.includes:items" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.references" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.references:items" }

Added Elements

  • AddedVertex { vertex_id: "games.atmosphere.define#field.value" }
  • AddedVertex { vertex_id: "games.atmosphere.define#filter.value" }
  • AddedVertex { vertex_id: "games.atmosphere.define#rule.value" }
  • AddedVertex { vertex_id: "games.atmosphere.define#rule.verify" }

Constraint Changes

  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#field.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#recordUse.role", sort: "knownValues", old_value: "[\"perk\",\"character\",\"cosmetic\",\"bonus\",\"interoperability\",\"stats\",\"activity\",\"leaderboard\",\"save\",\"replay\",\"session\",\"profile\",\"inventory\",\"grant\",\"validation\",\"label\",\"other\"]", new_value: "[\"character\",\"perk\",\"cosmetic\",\"interop\",\"stats\",\"activity\",\"leaderboard\",\"profile\",\"session\",\"inventory\",\"other\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#rule.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }
  • ConstraintTightened ConstraintTightened { vertex_id: "games.atmosphere.define#filter.op", sort: "knownValues", old_value: "[\"exists\",\"notExists\",\"isViewer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]", new_value: "[\"exists\",\"notExists\",\"isPlayer\",\"eq\",\"neq\",\"gt\",\"gte\",\"lt\",\"lte\"]" }

Additional Notes

  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.key", kind: "prop", name: Some("key") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.path", kind: "prop", name: Some("path") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#referenceDisplay", src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.label", kind: "prop", name: Some("label") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#lexiconRef", src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.nsid", kind: "prop", name: Some("nsid") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#reference", src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.role", kind: "prop", name: Some("role") }
  • Breaking: RequiredEdgeRemoved { vertex_id: "games.atmosphere.define#reference", src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.nsid", kind: "prop", name: Some("nsid") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueInteger", kind: "prop", name: Some("valueInteger") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.valueString", kind: "prop", name: Some("valueString") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueInteger", kind: "prop", name: Some("valueInteger") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.valueString", kind: "prop", name: Some("valueString") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.acquire", kind: "prop", name: Some("acquire") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.purpose", kind: "prop", name: Some("purpose") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#lexiconRef", tgt: "games.atmosphere.define#lexiconRef.verify", kind: "prop", name: Some("verify") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#lexiconRef.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.display", kind: "prop", name: Some("display") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#recordUse.display", tgt: "games.atmosphere.define#recordUse.display:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#recordUse.display:items", tgt: "games.atmosphere.define#referenceDisplay", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.acquire", kind: "prop", name: Some("acquire") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.authority", kind: "prop", name: Some("authority") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.display", kind: "prop", name: Some("display") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.filters", kind: "prop", name: Some("filters") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.label", kind: "prop", name: Some("label") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.path", kind: "prop", name: Some("path") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.purpose", kind: "prop", name: Some("purpose") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.rkey", kind: "prop", name: Some("rkey") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference", tgt: "games.atmosphere.define#reference.verify", kind: "prop", name: Some("verify") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference.display", tgt: "games.atmosphere.define#reference.display:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference.display:items", tgt: "games.atmosphere.define#referenceDisplay", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference.filters", tgt: "games.atmosphere.define#reference.filters:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference.filters:items", tgt: "games.atmosphere.define#filter", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#reference.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.aggregate", kind: "prop", name: Some("aggregate") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.divideBy", kind: "prop", name: Some("divideBy") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.format", kind: "prop", name: Some("format") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.maximumFractionDigits", kind: "prop", name: Some("maximumFractionDigits") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.multiplyBy", kind: "prop", name: Some("multiplyBy") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.priority", kind: "prop", name: Some("priority") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#referenceDisplay", tgt: "games.atmosphere.define#referenceDisplay.unit", kind: "prop", name: Some("unit") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueBoolean", kind: "prop", name: Some("valueBoolean") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueInteger", kind: "prop", name: Some("valueInteger") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.valueString", kind: "prop", name: Some("valueString") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.includes", kind: "prop", name: Some("includes") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.references", kind: "prop", name: Some("references") }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body.includes", tgt: "games.atmosphere.define:body.includes:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body.includes:items", tgt: "games.atmosphere.define#lexiconRef", kind: "ref", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body.references", tgt: "games.atmosphere.define:body.references:items", kind: "items", name: None }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body.references:items", tgt: "games.atmosphere.define#reference", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#field", tgt: "games.atmosphere.define#field.value", kind: "prop", name: Some("value") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#filter", tgt: "games.atmosphere.define#filter.value", kind: "prop", name: Some("value") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.value", kind: "prop", name: Some("value") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#rule", tgt: "games.atmosphere.define#rule.verify", kind: "prop", name: Some("verify") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#rule.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
1 1
{
2 2
  "id": "games.atmosphere.define",
3 3
  "defs": {
4 4
    "all": {
5 5
      "type": "object",
6 6
      "required": [
7 7
        "check",
8 8
        "rules"
9 9
      ],
10 10
      "properties": {
11 11
        "check": {
12 12
          "type": "string",
13 13
          "const": "all"
14 14
        },
15 15
        "label": {
16 16
          "type": "string",
17 17
          "maxLength": 120
18 18
        },
19 19
        "rules": {
20 20
          "type": "array",
21 21
          "items": {
22 22
            "ref": "#rule",
23 23
            "type": "ref"
24 24
          },
25 25
          "maxLength": 16,
26 26
          "minLength": 1
27 27
        },
28 28
        "acquire": {
29 29
          "type": "string",
30 30
          "format": "uri"
31 31
        }
32 32
      },
33 -
      "description": "Logical AND. Passes only when every sub-rule passes."
33 +
      "description": "Passes only when every rule passes."
34 34
    },
35 35
    "any": {
36 36
      "type": "object",
37 37
      "required": [
38 38
        "check",
39 39
        "rules"
40 40
      ],
41 41
      "properties": {
42 42
        "check": {
43 43
          "type": "string",
44 44
          "const": "any"
45 45
        },
46 46
        "label": {
47 47
          "type": "string",
48 48
          "maxLength": 120
49 49
        },
50 50
        "rules": {
51 51
          "type": "array",
52 52
          "items": {
53 53
            "ref": "#rule",
54 54
            "type": "ref"
55 55
          },
56 56
          "maxLength": 16,
57 57
          "minLength": 1
58 58
        },
59 59
        "acquire": {
60 60
          "type": "string",
61 61
          "format": "uri"
62 62
        }
63 63
      },
64 -
      "description": "Logical OR. Passes when at least one sub-rule passes, e.g. 'holds a sheet in any of these systems'."
64 +
      "description": "Passes when at least one rule passes."
65 65
    },
66 66
    "not": {
67 67
      "type": "object",
68 68
      "required": [
69 69
        "check",
70 70
        "rule"
71 71
      ],
72 72
      "properties": {
73 73
        "rule": {
74 74
          "ref": "#rule",
75 75
          "type": "ref"
76 76
        },
77 77
        "check": {
78 78
          "type": "string",
79 79
          "const": "not"
80 80
        },
81 81
        "label": {
82 82
          "type": "string",
83 83
          "maxLength": 120
84 84
        }
85 85
      },
86 -
      "description": "Logical NOT. Passes only when the sub-rule fails. Use for exclusion gates: 'has not already claimed this reward'."
86 +
      "description": "Passes only when the nested rule fails."
87 87
    },
88 88
    "main": {
89 89
      "key": "any",
90 90
      "type": "record",
91 91
      "record": {
92 92
        "type": "object",
93 93
        "required": [
94 94
          "name",
95 95
          "url",
96 96
          "publisher",
97 97
          "category",
98 98
          "createdAt"
99 99
        ],
100 100
        "properties": {
101 101
          "url": {
102 102
            "type": "string",
103 103
            "format": "uri",
104 -
            "description": "URL at which the game is played, downloaded, or accessed. This is a launch location, not the record's identity."
104 +
            "description": "Where to play, download, or access the game."
105 105
          },
106 106
          "icon": {
107 107
            "type": "blob",
108 108
            "accept": [
109 109
              "image/png",
110 110
              "image/webp"
111 111
            ],
112 112
            "maxSize": 512000,
113 -
            "description": "Square icon for compact display contexts. Recommended 256x256 px."
113 +
            "description": "Square icon. 256x256 recommended."
114 114
          },
115 115
          "name": {
116 116
            "type": "string",
117 117
            "maxLength": 100,
118 -
            "description": "Display name of the experience as shown in portal listings."
118 +
            "description": "Display name."
119 119
          },
120 120
          "tags": {
121 121
            "type": "array",
122 122
            "items": {
123 123
              "type": "string",
124 124
              "maxLength": 32
125 125
            },
126 126
            "maxLength": 12,
127 -
            "description": "Freeform tags for search and discovery (e.g. 'arcade', 'pixel art', 'multiplayer')."
127 +
            "description": "Freeform search tags."
128 128
          },
129 129
          "uses": {
130 130
            "type": "array",
131 131
            "items": {
132 132
              "ref": "#recordUse",
133 133
              "type": "ref"
134 134
            },
135 135
            "maxLength": 32,
136 -
            "description": "Non-required records this game uses, understands, produces, validates, or wants portals to read. Use requires[] only for hard gates. Use uses[] for everything else: optional gameplay perks, character imports, cosmetics, bonuses, interoperability, stats, saves, activity, sessions, replays, leaderboards, labels, grants, validation, inventory, or profile context. The role and purpose fields explain whether the use is a player-facing benefit, a game-authored record, or a portal-readable display surface."
136 +
            "description": "Other records this game reads or writes. Not required to play."
137 137
          },
138 138
          "cover": {
139 139
            "type": "blob",
140 140
            "accept": [
141 141
              "image/png",
142 142
              "image/jpeg",
143 143
              "image/webp"
144 144
            ],
145 145
            "maxSize": 4000000,
146 -
            "description": "Primary cover image. Portals display this as the card thumbnail. Recommended ratio 16:9."
146 +
            "description": "Card thumbnail image. 16:9 recommended."
147 147
          },
148 148
          "media": {
149 149
            "type": "array",
150 150
            "items": {
151 151
              "ref": "#mediaItem",
152 152
              "type": "ref"
153 153
            },
154 154
            "maxLength": 24,
155 -
            "description": "Extended media gallery, screenshots, banners, key art, and posters a portal can show on a detail page. 'cover' and 'icon' above stay the primary card images; this is the deeper set, mirroring the rich galleries dedicated game catalogs keep."
155 +
            "description": "Extra screenshots, banners, and key art."
156 156
          },
157 157
          "status": {
158 158
            "type": "string",
159 -
            "description": "Current availability. Known values: 'live', 'beta', 'coming' (announced but not yet playable), 'archived' (no longer available). Open set; portals may badge or filter on these.",
159 +
            "description": "Current availability.",
160 160
            "knownValues": [
161 161
              "live",
162 162
              "beta",
163 163
              "coming",
164 164
              "archived"
165 165
            ]
166 166
          },
167 167
          "catalog": {
168 168
            "type": "array",
169 169
            "items": {
170 170
              "ref": "#catalogRef",
171 171
              "type": "ref"
172 172
            },
173 173
            "maxLength": 8,
174 -
            "description": "Optional links to records in other game catalogs that describe this same title, most often a Pentaract (games.gamesgamesgamesgames.game) entry. This is how a definition borrows rich metadata a dedicated catalog already maintains, genres, platforms, screenshots, release dates, ratings, instead of duplicating it here. Purely supplementary: evaluation never reads these, and the experience is complete without them. Cooperate, don't re-enter."
174 +
            "description": "Links to matching entries in other game catalogs. Purely supplementary."
175 175
          },
176 176
          "tagline": {
177 177
            "type": "string",
178 178
            "maxLength": 200,
179 -
            "description": "One-line summary shown beneath the title in card views."
179 +
            "description": "One-line summary."
180 180
          },
181 181
          "category": {
182 182
            "type": "string",
183 183
            "maxLength": 30,
184 -
            "description": "Broad type of experience, used for portal filtering and display. Known values: 'browser' (plays in a web browser), 'download' (downloaded and run locally), 'physical' (tabletop or in-person), 'other'. This is an open set, portals should tolerate values they do not recognise.",
184 +
            "description": "Type of experience.",
185 185
            "knownValues": [
186 186
              "browser",
187 187
              "download",
188 188
              "physical",
189 189
              "other"
190 190
            ]
191 191
          },
192 -
          "includes": {
193 -
            "type": "array",
194 -
            "items": {
195 -
              "ref": "#lexiconRef",
196 -
              "type": "ref"
197 -
            },
198 -
            "maxLength": 24,
199 -
            "description": "Deprecated compatibility field. Use uses[] instead. Older records used includes[] for optional player-facing records that change or enrich gameplay when present."
200 -
          },
201 192
          "requires": {
202 193
            "type": "array",
203 194
            "items": {
204 195
              "ref": "#rule",
205 196
              "type": "ref"
206 197
            },
207 198
            "maxLength": 16,
208 -
            "description": "Hard playability requirements. Every rule must pass before the game can be played as declared. Do not put recommendations, bonuses, or merely supported records here. Portals surface failures as actionable prompts using each rule's 'acquire' link."
199 +
            "description": "Hard gates. Every rule must pass before a player can use this game."
209 200
          },
210 201
          "trailers": {
211 202
            "type": "array",
212 203
            "items": {
213 204
              "ref": "#video",
214 205
              "type": "ref"
215 206
            },
216 207
            "maxLength": 8,
217 -
            "description": "Video trailers and gameplay clips. Hosted externally (YouTube, Vimeo, Twitch) or linked directly so portals can embed or link them."
208 +
            "description": "Video trailers or gameplay clips."
218 209
          },
219 210
          "createdAt": {
220 211
            "type": "string",
221 212
            "format": "datetime"
222 213
          },
223 214
          "developer": {
224 215
            "ref": "#party",
225 216
            "type": "ref",
226 -
            "description": "The studio or individual who built the experience. Prefer a DID when available so the developer is verifiable on the network."
217 +
            "description": "The studio or person who made this."
227 218
          },
228 219
          "legacyIds": {
229 220
            "type": "array",
230 221
            "items": {
231 222
              "type": "string",
232 223
              "maxLength": 80
233 224
            },
234 225
            "maxLength": 12,
235 -
            "description": "Stable identifiers used by older catalogues, score readers, or inventory integrations for this same game. These are compatibility aliases, not canonical identity."
226 +
            "description": "Old IDs used for this same game by other catalogs or tools."
236 227
          },
237 228
          "publisher": {
238 229
            "type": "string",
239 230
            "format": "at-uri",
240 -
            "description": "Stable AT-URI identifying the account that publishes and maintains this definition, normally at:// followed by the publishing DID. It must name the same repository that contains this record; portals should reject a mismatch."
231 +
            "description": "AT-URI of the repo that owns this record. Must match this record's own repo."
241 232
          },
242 233
          "updatedAt": {
243 234
            "type": "string",
244 235
            "format": "datetime"
245 -
          },
246 -
          "references": {
247 -
            "type": "array",
248 -
            "items": {
249 -
              "ref": "#reference",
250 -
              "type": "ref"
251 -
            },
252 -
            "maxLength": 24,
253 -
            "description": "Deprecated compatibility field. Use uses[] instead. Older records used references[] for non-gating stat, save, activity, replay, leaderboard, validation, label, grant, profile, or portal-readable context."
254 236
          },
255 237
          "releasedAt": {
256 238
            "type": "string",
257 239
            "format": "datetime",
258 -
            "description": "When this experience became publicly available."
240 +
            "description": "When this became available."
259 241
          },
260 242
          "description": {
261 243
            "type": "string",
262 244
            "maxLength": 2000,
263 -
            "description": "Full description of the experience. Plain text; portals may render line breaks."
245 +
            "description": "Full description."
264 246
          },
265 247
          "statNamespace": {
266 248
            "type": "string",
267 249
            "maxLength": 80,
268 -
            "description": "Deprecated compatibility hint. Use references[] with role 'activity' or 'stats' to describe player activity records and display metrics."
250 +
            "description": "Deprecated. Use uses[] instead."
269 251
          }
270 252
        }
271 253
      },
272 -
      "description": "Published to the publisher's own repository, one record per game. Use a stable, readable record key and update that same record in place. The record's at:// URI is its canonical identity; 'url' is an access location and may change. A portal must not merge definitions solely because their URLs match."
254 +
      "description": "One game definition per record, published in the developer's own repo. Keep the same rkey to update it in place."
273 255
    },
274 256
    "rule": {
275 257
      "type": "object",
276 258
      "required": [
277 259
        "check"
278 260
      ],
279 261
      "properties": {
280 262
        "op": {
281 263
          "type": "string",
282 -
          "description": "For field: comparison operator.",
264 +
          "description": "Comparison operator.",
283 265
          "knownValues": [
284 266
            "exists",
285 267
            "notExists",
286 -
            "isViewer",
268 +
            "isPlayer",
287 269
            "eq",
288 270
            "neq",
289 271
            "gt",
290 272
            "gte",
291 273
            "lt",
292 274
            "lte"
293 275
          ]
294 276
        },
295 277
        "nsid": {
296 278
          "type": "string",
297 279
          "format": "nsid",
298 -
          "description": "Collection read by record, field, matches, or vouch."
280 +
          "description": "Collection to read."
299 281
        },
300 282
        "rkey": {
301 283
          "type": "string",
302 284
          "maxLength": 50,
303 -
          "description": "For field: record key, default 'self'; 'any' scans the collection."
285 +
          "description": "Record key. Defaults to 'self'; 'any' scans the collection."
304 286
        },
305 287
        "rule": {
306 288
          "ref": "#rule",
307 289
          "type": "ref",
308 -
          "description": "For not: nested rule to negate."
290 +
          "description": "Nested rule for not."
309 291
        },
310 292
        "check": {
311 293
          "type": "string",
312 -
          "description": "Rule discriminator. Known values are open for forward compatibility; an unknown value must not pass.",
294 +
          "description": "Rule type.",
313 295
          "knownValues": [
314 296
            "record",
315 297
            "field",
316 298
            "matches",
317 299
            "vouch",
318 300
            "all",
319 301
            "any",
320 302
            "not"
321 303
          ]
322 304
        },
323 305
        "field": {
324 306
          "type": "string",
325 307
          "maxLength": 200,
326 -
          "description": "For field: dot-path to test."
308 +
          "description": "Dot-path to test."
327 309
        },
328 310
        "label": {
329 311
          "type": "string",
330 312
          "maxLength": 120,
331 -
          "description": "Human-readable requirement."
313 +
          "description": "Why this is required."
332 314
        },
333 315
        "rules": {
334 316
          "type": "array",
335 317
          "items": {
336 318
            "ref": "#rule",
337 319
            "type": "ref"
338 320
          },
339 321
          "maxLength": 16,
340 322
          "minLength": 1,
341 -
          "description": "For all or any: nested rules."
323 +
          "description": "Nested rules for all/any."
324 +
        },
325 +
        "value": {
326 +
          "type": "unknown",
327 +
          "description": "Comparison value."
342 328
        },
329 +
        "verify": {
330 +
          "ref": "#rule",
331 +
          "type": "ref",
332 +
          "description": "Additional proof that must also pass when this rule is used in requires[]."
333 +
        },
343 334
        "acquire": {
344 335
          "type": "string",
345 336
          "format": "uri",
346 -
          "description": "URL where a player can fulfil this requirement."
337 +
          "description": "Where to get this."
347 338
        },
348 339
        "filters": {
349 340
          "type": "array",
350 341
          "items": {
351 342
            "ref": "#filter",
352 343
            "type": "ref"
353 344
          },
354 345
          "maxLength": 8,
355 346
          "minLength": 1,
356 -
          "description": "For matches or vouch: conditions that must hold on one record."
347 +
          "description": "Conditions for matches or vouch."
357 348
        },
358 349
        "authority": {
359 350
          "type": "string",
360 351
          "format": "did",
361 -
          "description": "For vouch: stable DID of the record issuer."
362 -
        },
363 -
        "valueString": {
364 -
          "type": "string",
365 -
          "maxLength": 1000,
366 -
          "description": "String comparison value."
367 -
        },
368 -
        "valueBoolean": {
369 -
          "type": "boolean",
370 -
          "description": "Boolean comparison value."
371 -
        },
372 -
        "valueInteger": {
373 -
          "type": "integer",
374 -
          "description": "Integer comparison value."
352 +
          "description": "DID of the trusted issuer, for vouch."
375 353
        }
376 354
      },
377 -
      "description": "One recursive playability rule, discriminated by 'check'. Lexicon does not permit a union as a top-level definition, so this object carries the fields used by all seven variants. Evaluators enforce each variant's required fields: record(check,nsid); field(check,nsid,field,op); matches(check,nsid,filters); vouch(check,authority,nsid); all/any(check,rules); not(check,rule). Unknown check values evaluate as unknown, never as pass."
355 +
      "description": "One playability rule. 'check' selects the variant: record, field, matches, vouch, all, any, or not. A rule may include verify for an additional required proof. An unknown check must never pass."
378 356
    },
379 357
    "field": {
380 358
      "type": "object",
381 359
      "required": [
382 360
        "check",
383 361
        "nsid",
384 362
        "field",
385 363
        "op"
386 364
      ],
387 365
      "properties": {
388 366
        "op": {
389 367
          "type": "string",
390 -
          "description": "How to test the field. exists/notExists check presence; eq/neq/gt/gte/lt/lte compare to a value; isViewer matches the signed-in player by their account ID (DID) and takes no value.",
368 +
          "description": "Comparison operator.",
391 369
          "knownValues": [
392 370
            "exists",
393 371
            "notExists",
394 -
            "isViewer",
372 +
            "isPlayer",
395 373
            "eq",
396 374
            "neq",
397 375
            "gt",
398 376
            "gte",
399 377
            "lt",
400 378
            "lte"
401 379
          ]
402 380
        },
403 381
        "nsid": {
404 382
          "type": "string",
405 383
          "format": "nsid"
406 384
        },
407 385
        "rkey": {
408 386
          "type": "string",
409 387
          "maxLength": 50,
410 -
          "description": "Record key. Defaults to 'self'. Use 'any' to pass if any record in the collection satisfies the condition."
388 +
          "description": "Record key. Defaults to 'self'; 'any' scans the collection."
411 389
        },
412 390
        "check": {
413 391
          "type": "string",
414 392
          "const": "field"
415 393
        },
416 394
        "field": {
417 395
          "type": "string",
418 396
          "maxLength": 200,
419 -
          "description": "Dot-path to the property to evaluate (e.g. 'score.total', 'level'). Array traversal is not supported."
397 +
          "description": "Dot-path to the property to test."
420 398
        },
421 399
        "label": {
422 400
          "type": "string",
423 401
          "maxLength": 120
424 402
        },
403 +
        "value": {
404 +
          "type": "unknown",
405 +
          "description": "Comparison value."
406 +
        },
425 407
        "acquire": {
426 408
          "type": "string",
427 409
          "format": "uri"
428 -
        },
429 -
        "valueString": {
430 -
          "type": "string",
431 -
          "maxLength": 1000,
432 -
          "description": "String comparison value. For value-taking operators, set exactly one of valueString, valueInteger, or valueBoolean."
433 -
        },
434 -
        "valueBoolean": {
435 -
          "type": "boolean",
436 -
          "description": "Boolean comparison value."
437 -
        },
438 -
        "valueInteger": {
439 -
          "type": "integer",
440 -
          "description": "Integer comparison value. Use for numeric gt/gte/lt/lte checks."
441 410
        }
442 411
      },
443 -
      "description": "Fetches a record from the player's repository and tests one field. Covers required fields, score thresholds, flags, and enum matches."
412 +
      "description": "Passes if a field on the player's record meets a condition."
444 413
    },
445 414
    "party": {
446 415
      "type": "object",
447 416
      "required": [
448 417
        "name"
449 418
      ],
450 419
      "properties": {
451 420
        "did": {
452 421
          "type": "string",
453 422
          "format": "did",
454 -
          "description": "AT Protocol DID of this entity's account, if they have one. On an atmosphere.games-managed provisional definition, this is also the DID expected to publish the canonical developer-owned definition."
423 +
          "description": "DID of this entity's account, if it has one."
455 424
        },
456 425
        "url": {
457 426
          "type": "string",
458 427
          "format": "uri",
459 -
          "description": "Website for this entity."
428 +
          "description": "Website."
460 429
        },
461 430
        "name": {
462 431
          "type": "string",
463 432
          "maxLength": 100,
464 -
          "description": "Display name of the entity."
433 +
          "description": "Display name."
465 434
        }
466 435
      },
467 -
      "description": "A named entity (developer, publisher, studio) associated with the experience."
436 +
      "description": "An entity associated with the experience, such as its developer."
468 437
    },
469 438
    "video": {
470 439
      "type": "object",
471 440
      "required": [
472 441
        "title"
473 442
      ],
474 443
      "properties": {
475 444
        "url": {
476 445
          "type": "string",
477 446
          "format": "uri",
478 -
          "description": "Full URL to the video, used when no platform/videoId is given."
447 +
          "description": "Direct URL, used when no platform/videoId is given."
479 448
        },
480 449
        "title": {
481 450
          "type": "string",
482 451
          "maxLength": 120,
483 -
          "description": "Label for the clip (e.g. 'Launch Trailer')."
452 +
          "description": "Clip title."
484 453
        },
485 454
        "videoId": {
486 455
          "type": "string",
487 456
          "maxLength": 120,
488 -
          "description": "Platform video id (e.g. a YouTube id). Combined with 'platform' to build an embed."
457 +
          "description": "Platform video id."
489 458
        },
490 459
        "platform": {
491 460
          "type": "string",
492 -
          "description": "Where the video lives. 'direct' means the url points straight at a video file or page.",
461 +
          "description": "Where the video lives.",
493 462
          "knownValues": [
494 463
            "youtube",
495 464
            "vimeo",
496 465
            "twitch",
497 466
            "direct"
498 467
          ]
499 468
        },
500 469
        "thumbnail": {
501 470
          "type": "blob",
502 471
          "accept": [
503 472
            "image/png",
504 473
            "image/jpeg",
505 474
            "image/webp"
506 475
          ],
507 476
          "maxSize": 2000000,
508 -
          "description": "Optional still frame shown before the video plays."
477 +
          "description": "Still frame shown before playing."
509 478
        }
510 479
      },
511 -
      "description": "A trailer or gameplay clip. Provide a platform + videoId (preferred, so portals embed natively) or a direct url."
480 +
      "description": "A trailer or gameplay clip."
512 481
    },
513 482
    "vouch": {
514 483
      "type": "object",
515 484
      "required": [
516 485
        "check",
517 486
        "authority",
518 487
        "nsid"
519 488
      ],
520 489
      "properties": {
521 490
        "nsid": {
522 491
          "type": "string",
523 492
          "format": "nsid",
524 -
          "description": "The kind of record to look for in that account's repo (e.g. equipment.rpg.give)."
493 +
          "description": "Collection to look for in the authority's repo."
525 494
        },
526 495
        "check": {
527 496
          "type": "string",
528 497
          "const": "vouch"
529 498
        },
530 499
        "label": {
531 500
          "type": "string",
532 501
          "maxLength": 120
533 502
        },
534 503
        "acquire": {
535 504
          "type": "string",
536 505
          "format": "uri"
537 506
        },
538 507
        "filters": {
539 508
          "type": "array",
540 509
          "items": {
541 510
            "ref": "#filter",
542 511
            "type": "ref"
543 512
          },
544 513
          "maxLength": 8,
545 -
          "description": "Conditions the record must meet, written exactly like a matches rule. Put the 'isViewer' operator on the field that names the player (e.g. recipient) to require the record reference the signed-in player; add value conditions (e.g. item equals jet_pack) to pin a specific grant. With no filters, any record of this kind on the authority's repo passes."
514 +
          "description": "Conditions the record must meet. Use 'isPlayer' to require it name the signed-in player."
546 515
        },
547 516
        "authority": {
548 517
          "type": "string",
549 518
          "format": "did",
550 -
          "description": "Stable DID of the account that issues the record (for example an item provider, guild, or tournament organiser). Handles are not accepted because they are mutable. A player can never be their own authority."
519 +
          "description": "DID of the account that issues the record."
551 520
        }
552 521
      },
553 -
      "description": "Passes when a trusted account's repo holds a record that meets the given conditions, optionally one that references the signed-in player. Because the record lives on the issuer's repo, not the player's, it cannot be forged. Use it for item grants, awards, memberships, approvals, licences, or any record one account publishes about another. Example: 'games.protoimsg.app has an equipment.rpg.give whose recipient is this player and whose item is jet_pack.'"
522 +
      "description": "Passes if a trusted authority's repo holds a matching record. Use for grants, awards, or approvals one account issues about another."
554 523
    },
555 524
    "filter": {
556 525
      "type": "object",
557 526
      "required": [
558 527
        "field",
559 528
        "op"
560 529
      ],
561 530
      "properties": {
562 531
        "op": {
563 532
          "type": "string",
564 -
          "description": "How to test the field. exists/notExists check presence; eq/neq/gt/gte/lt/lte compare to a value; isViewer matches the signed-in player by their account ID (DID) and takes no value.",
533 +
          "description": "Comparison operator.",
565 534
          "knownValues": [
566 535
            "exists",
567 536
            "notExists",
568 -
            "isViewer",
537 +
            "isPlayer",
569 538
            "eq",
570 539
            "neq",
571 540
            "gt",
572 541
            "gte",
573 542
            "lt",
574 543
            "lte"
575 544
          ]
576 545
        },
577 546
        "field": {
578 547
          "type": "string",
579 548
          "maxLength": 200,
580 549
          "description": "Dot-path to the field."
581 550
        },
582 -
        "valueString": {
583 -
          "type": "string",
584 -
          "maxLength": 1000,
585 -
          "description": "String comparison value. For value-taking operators, set exactly one typed value property."
586 -
        },
587 -
        "valueBoolean": {
588 -
          "type": "boolean",
589 -
          "description": "Boolean comparison value."
590 -
        },
591 -
        "valueInteger": {
592 -
          "type": "integer",
593 -
          "description": "Integer comparison value. Use for numeric gt/gte/lt/lte checks."
551 +
        "value": {
552 +
          "type": "unknown",
553 +
          "description": "Comparison value."
594 554
        }
595 555
      },
596 -
      "description": "A single condition on a record's contents, used by matches and vouch. Most operators compare the field to a value. The special 'isViewer' operator takes no value and passes when the field identifies the signed-in player by their account ID (DID). It accepts the DID directly or an at:// URI whose repo is the player, and never matches on a handle, since handles can change. This is how a static definition points at whoever is reading it."
556 +
      "description": "One field condition, used by matches and vouch. 'isPlayer' passes when the field names the signed-in player."
597 557
    },
598 558
    "record": {
599 559
      "type": "object",
600 560
      "required": [
601 561
        "check",
602 562
        "nsid"
603 563
      ],
604 564
      "properties": {
605 565
        "nsid": {
606 566
          "type": "string",
607 567
          "format": "nsid",
608 -
          "description": "Collection to check on the player's PDS (e.g. 'actor.rpg.sprite')."
568 +
          "description": "Collection to check."
609 569
        },
610 570
        "check": {
611 571
          "type": "string",
612 572
          "const": "record"
613 573
        },
614 574
        "label": {
615 575
          "type": "string",
616 576
          "maxLength": 120,
617 -
          "description": "Human-readable requirement shown when gated (e.g. 'An rpg.actor sprite')."
577 +
          "description": "Why this is required."
618 578
        },
619 579
        "acquire": {
620 580
          "type": "string",
621 581
          "format": "uri",
622 -
          "description": "URL to send players who fail, so they can fulfil the requirement."
582 +
          "description": "Where to get this."
623 583
        }
624 584
      },
625 -
      "description": "Passes if the player's PDS holds at least one record in the given collection. The simplest gate: 'does this person participate in this lexicon at all?'"
585 +
      "description": "Passes if the player holds any record in this collection."
626 586
    },
627 587
    "matches": {
628 588
      "type": "object",
629 589
      "required": [
630 590
        "check",
631 591
        "nsid",
632 592
        "filters"
633 593
      ],
634 594
      "properties": {
635 595
        "nsid": {
636 596
          "type": "string",
637 597
          "format": "nsid"
638 598
        },
639 599
        "check": {
640 600
          "type": "string",
641 601
          "const": "matches"
642 602
        },
643 603
        "label": {
644 604
          "type": "string",
645 605
          "maxLength": 120
646 606
        },
647 607
        "acquire": {
648 608
          "type": "string",
649 609
          "format": "uri"
650 610
        },
651 611
        "filters": {
652 612
          "type": "array",
653 613
          "items": {
654 614
            "ref": "#filter",
655 615
            "type": "ref"
656 616
          },
657 617
          "maxLength": 8,
658 618
          "minLength": 1,
659 -
          "description": "All filters must match on the same record (AND semantics within one record)."
619 +
          "description": "All filters must match on the same record."
660 620
        }
661 621
      },
662 -
      "description": "Scans the player's collection and passes if any single record satisfies all filters simultaneously. Use to find a record by content rather than by key, e.g. 'holds item X', 'has membership tier Y'."
622 +
      "description": "Passes if one record satisfies all filters."
663 623
    },
664 624
    "mediaItem": {
665 625
      "type": "object",
666 626
      "required": [
667 627
        "image"
668 628
      ],
669 629
      "properties": {
670 630
        "alt": {
671 631
          "type": "string",
672 632
          "maxLength": 300,
673 -
          "description": "Accessibility caption describing the image."
633 +
          "description": "Accessibility caption."
674 634
        },
675 635
        "type": {
676 636
          "type": "string",
677 -
          "description": "What kind of image this is, so portals can place it (e.g. 'banner' across the top, 'screenshot' in a gallery).",
637 +
          "description": "Kind of image.",
678 638
          "knownValues": [
679 639
            "screenshot",
680 640
            "banner",
681 641
            "artwork",
682 642
            "poster",
683 643
            "background",
684 644
            "logo",
685 645
            "thumbnail"
686 646
          ]
687 647
        },
688 648
        "image": {
689 649
          "type": "blob",
690 650
          "accept": [
691 651
            "image/png",
692 652
            "image/jpeg",
693 653
            "image/webp",
694 654
            "image/gif"
695 655
          ],
696 656
          "maxSize": 8000000,
697 -
          "description": "The image blob, stored on the developer's PDS."
657 +
          "description": "The image blob."
698 658
        },
699 659
        "width": {
700 660
          "type": "integer",
701 -
          "description": "Pixel width, if known, lets portals reserve layout space before the blob loads."
661 +
          "description": "Pixel width, if known."
702 662
        },
703 663
        "height": {
704 664
          "type": "integer",
705 665
          "description": "Pixel height, if known."
706 666
        }
707 667
      },
708 -
      "description": "One image in the experience's media gallery."
668 +
      "description": "One image in the media gallery."
709 669
    },
710 670
    "recordUse": {
711 671
      "type": "object",
712 672
      "required": [
713 673
        "role",
714 674
        "nsid"
715 675
      ],
716 676
      "properties": {
717 677
        "nsid": {
718 678
          "type": "string",
719 679
          "format": "nsid",
720 -
          "description": "Collection to read or use."
680 +
          "description": "Collection to read."
721 681
        },
722 682
        "path": {
723 683
          "type": "string",
724 684
          "maxLength": 200,
725 -
          "description": "Optional dot-path to the relevant payload within the record, e.g. 'data' inside actor.rpg.stats/clunscannon."
685 +
          "description": "Dot-path to the relevant value inside the record."
726 686
        },
727 687
        "rkey": {
728 688
          "type": "string",
729 689
          "maxLength": 50,
730 -
          "description": "Record key to read from a player's repo. Defaults to 'self'; use 'any' when a portal should scan the collection."
690 +
          "description": "Record key. Defaults to 'self'; 'any' scans the collection."
731 691
        },
732 692
        "role": {
733 693
          "type": "string",
734 -
          "description": "How this record is used. Player-benefit roles such as perk, character, cosmetic, bonus, and interoperability describe optional game behavior. Data roles such as stats, activity, leaderboard, save, replay, session, profile, inventory, grant, validation, and label describe records portals/tools may read or display.",
694 +
          "description": "What this record is used for.",
735 695
          "knownValues": [
736 -
            "perk",
737 696
            "character",
697 +
            "perk",
738 698
            "cosmetic",
739 -
            "bonus",
740 -
            "interoperability",
699 +
            "interop",
741 700
            "stats",
742 701
            "activity",
743 702
            "leaderboard",
744 -
            "save",
745 -
            "replay",
746 -
            "session",
747 703
            "profile",
748 -
            "inventory",
749 -
            "grant",
750 -
            "validation",
751 -
            "label",
752 -
            "other"
753 -
          ]
754 -
        },
755 -
        "label": {
756 -
          "type": "string",
757 -
          "maxLength": 120,
758 -
          "description": "Human label for this use."
759 -
        },
760 -
        "verify": {
761 -
          "ref": "#rule",
762 -
          "type": "ref",
763 -
          "description": "Optional rule that detects, authenticates, or validates this use. For player-benefit roles, it badges whether the benefit is available. For data roles, it badges whether the displayed record is trusted."
764 -
        },
765 -
        "acquire": {
766 -
          "type": "string",
767 -
          "format": "uri",
768 -
          "description": "Optional URL where a player can create, obtain, or manage this record."
769 -
        },
770 -
        "display": {
771 -
          "type": "array",
772 -
          "items": {
773 -
            "ref": "#referenceDisplay",
774 -
            "type": "ref"
775 -
          },
776 -
          "maxLength": 8,
777 -
          "description": "Small metrics a portal may render on cards or profiles."
778 -
        },
779 -
        "filters": {
780 -
          "type": "array",
781 -
          "items": {
782 -
            "ref": "#filter",
783 -
            "type": "ref"
784 -
          },
785 -
          "maxLength": 8,
786 -
          "description": "Optional filters used when rkey is 'any' or authority is set. Conditions must match on one record."
787 -
        },
788 -
        "purpose": {
789 -
          "type": "string",
790 -
          "maxLength": 300,
791 -
          "description": "Plain-language reason this record matters. This should say whether it unlocks a benefit, imports player data, stores progress, validates a score, or powers portal display."
792 -
        },
793 -
        "authority": {
794 -
          "type": "string",
795 -
          "format": "did",
796 -
          "description": "When the referenced record lives in a trusted authority repo instead of the player's repo, this DID names that repo."
797 -
        }
798 -
      },
799 -
      "description": "One non-required AT Protocol record relationship for this game. This single shape covers optional gameplay benefits and portal-readable data. Examples: role 'perk' for a Jetpack item that changes play; role 'character' for a sprite the game can import; role 'stats' for a score record portals can display; role 'validation' for an authority record that confirms a stat. Hard gates still belong in requires[]."
800 -
    },
801 -
    "reference": {
802 -
      "type": "object",
803 -
      "required": [
804 -
        "role",
805 -
        "nsid"
806 -
      ],
807 -
      "properties": {
808 -
        "nsid": {
809 -
          "type": "string",
810 -
          "format": "nsid",
811 -
          "description": "Collection to read."
812 -
        },
813 -
        "path": {
814 -
          "type": "string",
815 -
          "maxLength": 200,
816 -
          "description": "Optional dot-path to the relevant payload within the record, e.g. 'clunscannon' inside actor.rpg.stats/self."
817 -
        },
818 -
        "rkey": {
819 -
          "type": "string",
820 -
          "maxLength": 50,
821 -
          "description": "Record key to read from a player's repo. Defaults to 'self'; use 'any' when a portal should scan the collection."
822 -
        },
823 -
        "role": {
824 -
          "type": "string",
825 -
          "description": "Why this collection is relevant. 'stats' and 'leaderboard' are for card summaries; 'activity' for player counts/recent activity; 'validation' for trusted attestations such as actor.rpg.master.",
826 -
          "knownValues": [
827 -
            "activity",
828 -
            "stats",
829 -
            "leaderboard",
830 -
            "save",
831 -
            "replay",
832 704
            "session",
833 -
            "profile",
834 705
            "inventory",
835 -
            "grant",
836 -
            "validation",
837 -
            "label",
838 706
            "other"
839 707
          ]
840 708
        },
841 709
        "label": {
842 710
          "type": "string",
843 711
          "maxLength": 120,
844 -
          "description": "Human label for this reference."
712 +
          "description": "Short label for this use."
845 713
        },
846 714
        "verify": {
847 715
          "ref": "#rule",
848 716
          "type": "ref",
849 -
          "description": "Optional rule that validates this reference before displaying it as trusted. Example: an actor.rpg.master vouch for a player's actor.rpg.stats system."
717 +
          "description": "Optional rule confirming this use is genuine."
850 718
        },
851 719
        "acquire": {
852 720
          "type": "string",
853 721
          "format": "uri",
854 -
          "description": "Optional URL where a player can create or manage this record."
855 -
        },
856 -
        "display": {
857 -
          "type": "array",
858 -
          "items": {
859 -
            "ref": "#referenceDisplay",
860 -
            "type": "ref"
861 -
          },
862 -
          "maxLength": 8,
863 -
          "description": "Small metrics a portal may render on cards or profiles."
722 +
          "description": "Where to create or manage this record."
864 723
        },
865 724
        "filters": {
866 725
          "type": "array",
867 726
          "items": {
868 727
            "ref": "#filter",
869 728
            "type": "ref"
870 729
          },
871 730
          "maxLength": 8,
872 -
          "description": "Optional filters used when rkey is 'any' or authority is set. Conditions must match on one record."
731 +
          "description": "Conditions to match, used with rkey 'any' or an authority."
873 732
        },
874 733
        "purpose": {
875 734
          "type": "string",
876 735
          "maxLength": 300,
877 -
          "description": "Why a portal or game reads this data."
736 +
          "description": "Why this record matters."
878 737
        },
879 738
        "authority": {
880 739
          "type": "string",
881 740
          "format": "did",
882 -
          "description": "When the referenced record lives in a trusted authority repo instead of the player's repo, this DID names that repo."
741 +
          "description": "DID of the repo holding this record, if not the player's own."
883 742
        }
884 743
      },
885 -
      "description": "Deprecated compatibility shape for references[]. Use recordUse in uses[]. A non-gating record surface relevant to stats, saves, leaderboards, activity, sessions, replays, validation, labels, grants, inventory, profile enrichment, or other portal-readable context."
744 +
      "description": "An optional record this game reads or writes. Not required to play; see requires[] for hard gates."
886 745
    },
887 746
    "catalogRef": {
888 747
      "type": "object",
889 748
      "required": [
890 749
        "uri"
891 750
      ],
892 751
      "properties": {
893 752
        "uri": {
894 753
          "type": "string",
895 754
          "format": "at-uri",
896 -
          "description": "AT-URI of the external catalog record (e.g. at://did:web:gamesgamesgamesgames.games/games.gamesgamesgamesgames.game/3mgjih2bzdp2l)."
755 +
          "description": "AT-URI of the external catalog record."
897 756
        },
898 757
        "name": {
899 758
          "type": "string",
900 759
          "maxLength": 100,
901 -
          "description": "Display name of the referenced entry, so portals can show it without resolving the record."
760 +
          "description": "Display name of the referenced entry."
902 761
        },
903 762
        "borrow": {
904 763
          "type": "array",
905 764
          "items": {
906 765
            "type": "string",
907 766
            "knownValues": [
908 767
              "media",
909 768
              "trailers",
910 769
              "genres",
911 770
              "platforms",
912 771
              "releases",
913 772
              "ratings",
914 773
              "description",
915 774
              "summary"
916 775
            ]
917 776
          },
918 777
          "maxLength": 8,
919 -
          "description": "Advisory hints naming which parts of the referenced record a portal may display alongside this experience (e.g. pull screenshots and genres from Pentaract rather than duplicating them here). Display guidance only, never affects eligibility."
778 +
          "description": "Which parts of the referenced record a portal may show alongside this one."
920 779
        },
921 780
        "source": {
922 781
          "type": "string",
923 782
          "maxLength": 60,
924 -
          "description": "Short label for the catalog this points at (e.g. 'pentaract')."
925 -
        }
926 -
      },
927 -
      "description": "A pointer to a record in another catalog that already describes this title in depth, most usefully a games.gamesgamesgamesgames.game record on The Pentaract, which carries genres, platforms, release dates, age ratings, and a full media gallery. The definition stays self-contained (eligibility never depends on it); the reference simply lets a portal fetch that richer metadata and show it alongside, so we build on existing game databases instead of re-entering everything."
928 -
    },
929 -
    "lexiconRef": {
930 -
      "type": "object",
931 -
      "required": [
932 -
        "nsid"
933 -
      ],
934 -
      "properties": {
935 -
        "nsid": {
936 -
          "type": "string",
937 -
          "format": "nsid"
938 -
        },
939 -
        "verify": {
940 -
          "ref": "#rule",
941 -
          "type": "ref",
942 -
          "description": "Optional rule that detects or authenticates this feature, typically a player-record match or a vouch in an issuer's separate grant collection. Portals may badge the feature when it passes. It never gates access."
943 -
        },
944 -
        "acquire": {
945 -
          "type": "string",
946 -
          "format": "uri",
947 -
          "description": "Optional URL where a player can obtain this record."
948 -
        },
949 -
        "purpose": {
950 -
          "type": "string",
951 -
          "maxLength": 200,
952 -
          "description": "The player-visible benefit this record unlocks or enriches when present. Shown to players."
953 -
        }
954 -
      },
955 -
      "description": "Deprecated compatibility shape for includes[]. Use recordUse in uses[]. An optional player-facing record collection this game can use when present."
956 -
    },
957 -
    "referenceDisplay": {
958 -
      "type": "object",
959 -
      "required": [
960 -
        "key",
961 -
        "label",
962 -
        "path"
963 -
      ],
964 -
      "properties": {
965 -
        "key": {
966 -
          "type": "string",
967 -
          "maxLength": 80,
968 -
          "description": "Stable metric key within this definition, e.g. 'bestDistance'."
969 -
        },
970 -
        "path": {
971 -
          "type": "string",
972 -
          "maxLength": 200,
973 -
          "description": "Dot-path to the value, relative to the reference path when set."
974 -
        },
975 -
        "unit": {
976 -
          "type": "string",
977 -
          "maxLength": 20,
978 -
          "description": "Unit suffix such as 'm', 'XP', or 'pts'."
979 -
        },
980 -
        "label": {
981 -
          "type": "string",
982 -
          "maxLength": 80,
983 -
          "description": "Short label shown before or beside the value."
984 -
        },
985 -
        "format": {
986 -
          "type": "string",
987 -
          "description": "Presentation hint for the value.",
988 -
          "knownValues": [
989 -
            "string",
990 -
            "integer",
991 -
            "number",
992 -
            "distance",
993 -
            "percent",
994 -
            "duration",
995 -
            "datetime",
996 -
            "boolean"
997 -
          ]
998 -
        },
999 -
        "divideBy": {
1000 -
          "type": "integer",
1001 -
          "minimum": 1,
1002 -
          "description": "Integer divisor applied before display, e.g. divideBy 10 for decimeters to meters."
1003 -
        },
1004 -
        "priority": {
1005 -
          "type": "integer",
1006 -
          "description": "Lower numbers display first."
1007 -
        },
1008 -
        "aggregate": {
1009 -
          "type": "string",
1010 -
          "description": "How to reduce multiple records. Defaults to 'first' for fixed rkey records and 'count' for collection scans.",
1011 -
          "knownValues": [
1012 -
            "first",
1013 -
            "count",
1014 -
            "max",
1015 -
            "min",
1016 -
            "sum",
1017 -
            "latest",
1018 -
            "exists"
1019 -
          ]
1020 -
        },
1021 -
        "multiplyBy": {
1022 -
          "type": "integer",
1023 -
          "description": "Integer multiplier applied before display. Use with divideBy for rational scaling."
1024 -
        },
1025 -
        "maximumFractionDigits": {
1026 -
          "type": "integer",
1027 -
          "maximum": 6,
1028 -
          "minimum": 0,
1029 -
          "description": "Decimal precision for numeric display."
783 +
          "description": "Short name of the catalog."
1030 784
        }
1031 785
      },
1032 -
      "description": "A declarative display metric derived from a referenced record or collection. Portals may ignore unsupported formats or aggregates."
786 +
      "description": "A link to a matching entry in another game catalog. Purely supplementary; never affects eligibility."
1033 787
    }
1034 788
  },
1035 789
  "$type": "com.atproto.lexicon.schema",
1036 790
  "lexicon": 1,
1037 -
  "description": "An AT Protocol game definition: a publisher's self-contained declaration of a playable experience, its presentation, the records a player must hold to play, and records the game can optionally use. Evaluators resolve requirements through AT Protocol repository reads; no game server or central eligibility database is required."
791 +
  "description": "A game definition: what it is, what a player needs to play it, and what records it uses."
1038 792
}

Compare Other Versions

Lexicon Garden

@