games.atmosphere.define

atmosphere.games

Schema Diff

+116 -276

From

CID
bafyreia6xhfyhiq...
Indexed At
2026-07-18 02:21 UTC
View this version

To

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

Compatibility Analysis

Breaking Changes Detected

100 breaking changes, 37 non-breaking changes.

Breaking Changes (100)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "games.atmosphere.define#recordUse", src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.role", kind: "prop", name: Some("role") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "games.atmosphere.define#recordUse", src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.nsid", kind: "prop", name: Some("nsid") }
  • 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#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.migratedFromAtUri" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.references" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.references:items" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.replaces" }
  • RemovedVertex RemovedVertex { vertex_id: "games.atmosphere.define:body.replaces: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#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.migratedFromAtUri", kind: "prop", name: Some("migratedFromAtUri") }
  • 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", tgt: "games.atmosphere.define:body.replaces", kind: "prop", name: Some("replaces") }
  • 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 }
  • RemovedEdge RemovedEdge { src: "games.atmosphere.define:body.replaces", tgt: "games.atmosphere.define:body.replaces:items", kind: "items", name: None }
  • 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#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\"]" }
Non-Breaking Changes (37)
  • 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#recordUse" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.acquire" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.authority" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.filters" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.filters:items" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.label" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.nsid" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.path" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.purpose" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.rkey" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.role" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#recordUse.verify" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#rule.value" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define#rule.verify" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define:body.uses" }
  • AddedVertex AddedVertex { vertex_id: "games.atmosphere.define:body.uses:items" }
  • 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#recordUse", tgt: "games.atmosphere.define#recordUse.acquire", kind: "prop", name: Some("acquire") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.authority", kind: "prop", name: Some("authority") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.filters", kind: "prop", name: Some("filters") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.label", kind: "prop", name: Some("label") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.path", kind: "prop", name: Some("path") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.purpose", kind: "prop", name: Some("purpose") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.rkey", kind: "prop", name: Some("rkey") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.verify", kind: "prop", name: Some("verify") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse.filters", tgt: "games.atmosphere.define#recordUse.filters:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse.filters:items", tgt: "games.atmosphere.define#filter", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "games.atmosphere.define#recordUse.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • 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 }
  • AddedEdge AddedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.uses", kind: "prop", name: Some("uses") }
  • AddedEdge AddedEdge { src: "games.atmosphere.define:body.uses", tgt: "games.atmosphere.define:body.uses:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "games.atmosphere.define:body.uses:items", tgt: "games.atmosphere.define#recordUse", 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#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.migratedFromAtUri" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.references" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.references:items" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.replaces" }
  • RemovedVertex { vertex_id: "games.atmosphere.define:body.replaces: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#recordUse" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.acquire" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.authority" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.filters" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.filters:items" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.label" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.nsid" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.path" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.purpose" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.rkey" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.role" }
  • AddedVertex { vertex_id: "games.atmosphere.define#recordUse.verify" }
  • AddedVertex { vertex_id: "games.atmosphere.define#rule.value" }
  • AddedVertex { vertex_id: "games.atmosphere.define#rule.verify" }
  • AddedVertex { vertex_id: "games.atmosphere.define:body.uses" }
  • AddedVertex { vertex_id: "games.atmosphere.define:body.uses:items" }

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#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: RequiredEdgeAdded { vertex_id: "games.atmosphere.define#recordUse", src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.role", kind: "prop", name: Some("role") }
  • Breaking: RequiredEdgeAdded { vertex_id: "games.atmosphere.define#recordUse", src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.nsid", kind: "prop", name: Some("nsid") }
  • 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#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#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#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.migratedFromAtUri", kind: "prop", name: Some("migratedFromAtUri") }
  • 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", tgt: "games.atmosphere.define:body.replaces", kind: "prop", name: Some("replaces") }
  • 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 }
  • Breaking: RemovedEdge { src: "games.atmosphere.define:body.replaces", tgt: "games.atmosphere.define:body.replaces:items", kind: "items", 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#recordUse", tgt: "games.atmosphere.define#recordUse.acquire", kind: "prop", name: Some("acquire") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.authority", kind: "prop", name: Some("authority") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.filters", kind: "prop", name: Some("filters") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.label", kind: "prop", name: Some("label") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.path", kind: "prop", name: Some("path") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.purpose", kind: "prop", name: Some("purpose") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.rkey", kind: "prop", name: Some("rkey") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse", tgt: "games.atmosphere.define#recordUse.verify", kind: "prop", name: Some("verify") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse.filters", tgt: "games.atmosphere.define#recordUse.filters:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse.filters:items", tgt: "games.atmosphere.define#filter", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define#recordUse.verify", tgt: "games.atmosphere.define#rule", kind: "ref", name: None }
  • 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 }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define:body", tgt: "games.atmosphere.define:body.uses", kind: "prop", name: Some("uses") }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define:body.uses", tgt: "games.atmosphere.define:body.uses:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "games.atmosphere.define:body.uses:items", tgt: "games.atmosphere.define#recordUse", 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 +
          },
129 +
          "uses": {
130 +
            "type": "array",
131 +
            "items": {
132 +
              "ref": "#recordUse",
133 +
              "type": "ref"
134 +
            },
135 +
            "maxLength": 32,
136 +
            "description": "Other records this game reads or writes. Not required to play."
128 137
          },
129 138
          "cover": {
130 139
            "type": "blob",
131 140
            "accept": [
132 141
              "image/png",
133 142
              "image/jpeg",
134 143
              "image/webp"
135 144
            ],
136 145
            "maxSize": 4000000,
137 -
            "description": "Primary cover image. Portals display this as the card thumbnail. Recommended ratio 16:9."
146 +
            "description": "Card thumbnail image. 16:9 recommended."
138 147
          },
139 148
          "media": {
140 149
            "type": "array",
141 150
            "items": {
142 151
              "ref": "#mediaItem",
143 152
              "type": "ref"
144 153
            },
145 154
            "maxLength": 24,
146 -
            "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."
147 156
          },
148 157
          "status": {
149 158
            "type": "string",
150 -
            "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.",
151 160
            "knownValues": [
152 161
              "live",
153 162
              "beta",
154 163
              "coming",
155 164
              "archived"
156 165
            ]
157 166
          },
158 167
          "catalog": {
159 168
            "type": "array",
160 169
            "items": {
161 170
              "ref": "#catalogRef",
162 171
              "type": "ref"
163 172
            },
164 173
            "maxLength": 8,
165 -
            "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."
166 175
          },
167 176
          "tagline": {
168 177
            "type": "string",
169 178
            "maxLength": 200,
170 -
            "description": "One-line summary shown beneath the title in card views."
179 +
            "description": "One-line summary."
171 180
          },
172 181
          "category": {
173 182
            "type": "string",
174 183
            "maxLength": 30,
175 -
            "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.",
176 185
            "knownValues": [
177 186
              "browser",
178 187
              "download",
179 188
              "physical",
180 189
              "other"
181 190
            ]
182 -
          },
183 -
          "includes": {
184 -
            "type": "array",
185 -
            "items": {
186 -
              "ref": "#lexiconRef",
187 -
              "type": "ref"
188 -
            },
189 -
            "maxLength": 24,
190 -
            "description": "Optional player-facing records that change or enrich the experience when present. Use includes[] when the game itself can do something extra for the player: import a character, unlock a cosmetic, grant a bonus, recognise an item, or enable an interoperability perk. An include may have verify logic so portals can badge whether that optional benefit is available. Includes never gate basic play; put hard gates in requires[]. Do not use includes[] merely to tell portals how to read stats, saves, activity, or leaderboard data; use references[] for that."
191 -
          },
192 -
          "replaces": {
193 -
            "type": "array",
194 -
            "items": {
195 -
              "type": "string",
196 -
              "format": "at-uri"
197 -
            },
198 -
            "maxLength": 12,
199 -
            "description": "Definition records this record intentionally supersedes. Used for ownership claims, rekeys, and mergers without encoding platform-specific migration language. A portal may trust a claim only when the replaced source definition names this record's repo DID as developer.did."
200 191
          },
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 236
          },
246 -
          "references": {
247 -
            "type": "array",
248 -
            "items": {
249 -
              "ref": "#reference",
250 -
              "type": "ref"
251 -
            },
252 -
            "maxLength": 24,
253 -
            "description": "Non-gating records that describe where this game's portable data lives and how portals or tools may read it. Use references[] for stats, saves, activity, sessions, replays, leaderboard entries, validation records, labels, grants, profiles, or other context that summarizes play. A reference is a reading recipe, not a player benefit: it may carry display metrics and an optional verify rule for trusted presentation, but it does not by itself say the game uses that record during play. Put hard access rules in requires[] and optional gameplay/perk integrations in includes[]."
254 -
          },
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."
269 -
          },
270 -
          "migratedFromAtUri": {
271 -
            "type": "string",
272 -
            "format": "at-uri",
273 -
            "description": "Deprecated compatibility field. Use 'replaces' for clean definition lineage. Exact URI of a previous definition republished into this repository during an ownership claim. Portals must accept this lineage only when the source definition names this repository DID as developer.did; lineage by itself is not proof of ownership."
250 +
            "description": "Deprecated. Use uses[] instead."
274 251
          }
275 252
        }
276 253
      },
277 -
      "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."
278 255
    },
279 256
    "rule": {
280 257
      "type": "object",
281 258
      "required": [
282 259
        "check"
283 260
      ],
284 261
      "properties": {
285 262
        "op": {
286 263
          "type": "string",
287 -
          "description": "For field: comparison operator.",
264 +
          "description": "Comparison operator.",
288 265
          "knownValues": [
289 266
            "exists",
290 267
            "notExists",
291 -
            "isViewer",
268 +
            "isPlayer",
292 269
            "eq",
293 270
            "neq",
294 271
            "gt",
295 272
            "gte",
296 273
            "lt",
297 274
            "lte"
298 275
          ]
299 276
        },
300 277
        "nsid": {
301 278
          "type": "string",
302 279
          "format": "nsid",
303 -
          "description": "Collection read by record, field, matches, or vouch."
280 +
          "description": "Collection to read."
304 281
        },
305 282
        "rkey": {
306 283
          "type": "string",
307 284
          "maxLength": 50,
308 -
          "description": "For field: record key, default 'self'; 'any' scans the collection."
285 +
          "description": "Record key. Defaults to 'self'; 'any' scans the collection."
309 286
        },
310 287
        "rule": {
311 288
          "ref": "#rule",
312 289
          "type": "ref",
313 -
          "description": "For not: nested rule to negate."
290 +
          "description": "Nested rule for not."
314 291
        },
315 292
        "check": {
316 293
          "type": "string",
317 -
          "description": "Rule discriminator. Known values are open for forward compatibility; an unknown value must not pass.",
294 +
          "description": "Rule type.",
318 295
          "knownValues": [
319 296
            "record",
320 297
            "field",
321 298
            "matches",
322 299
            "vouch",
323 300
            "all",
324 301
            "any",
325 302
            "not"
326 303
          ]
327 304
        },
328 305
        "field": {
329 306
          "type": "string",
330 307
          "maxLength": 200,
331 -
          "description": "For field: dot-path to test."
308 +
          "description": "Dot-path to test."
332 309
        },
333 310
        "label": {
334 311
          "type": "string",
335 312
          "maxLength": 120,
336 -
          "description": "Human-readable requirement."
313 +
          "description": "Why this is required."
337 314
        },
338 315
        "rules": {
339 316
          "type": "array",
340 317
          "items": {
341 318
            "ref": "#rule",
342 319
            "type": "ref"
343 320
          },
344 321
          "maxLength": 16,
345 322
          "minLength": 1,
346 -
          "description": "For all or any: nested rules."
323 +
          "description": "Nested rules for all/any."
347 324
        },
325 +
        "value": {
326 +
          "type": "unknown",
327 +
          "description": "Comparison value."
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 +
        },
348 334
        "acquire": {
349 335
          "type": "string",
350 336
          "format": "uri",
351 -
          "description": "URL where a player can fulfil this requirement."
337 +
          "description": "Where to get this."
352 338
        },
353 339
        "filters": {
354 340
          "type": "array",
355 341
          "items": {
356 342
            "ref": "#filter",
357 343
            "type": "ref"
358 344
          },
359 345
          "maxLength": 8,
360 346
          "minLength": 1,
361 -
          "description": "For matches or vouch: conditions that must hold on one record."
347 +
          "description": "Conditions for matches or vouch."
362 348
        },
363 349
        "authority": {
364 350
          "type": "string",
365 351
          "format": "did",
366 -
          "description": "For vouch: stable DID of the record issuer."
367 -
        },
368 -
        "valueString": {
369 -
          "type": "string",
370 -
          "maxLength": 1000,
371 -
          "description": "String comparison value."
372 -
        },
373 -
        "valueBoolean": {
374 -
          "type": "boolean",
375 -
          "description": "Boolean comparison value."
376 -
        },
377 -
        "valueInteger": {
378 -
          "type": "integer",
379 -
          "description": "Integer comparison value."
352 +
          "description": "DID of the trusted issuer, for vouch."
380 353
        }
381 354
      },
382 -
      "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."
383 356
    },
384 357
    "field": {
385 358
      "type": "object",
386 359
      "required": [
387 360
        "check",
388 361
        "nsid",
389 362
        "field",
390 363
        "op"
391 364
      ],
392 365
      "properties": {
393 366
        "op": {
394 367
          "type": "string",
395 -
          "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.",
396 369
          "knownValues": [
397 370
            "exists",
398 371
            "notExists",
399 -
            "isViewer",
372 +
            "isPlayer",
400 373
            "eq",
401 374
            "neq",
402 375
            "gt",
403 376
            "gte",
404 377
            "lt",
405 378
            "lte"
406 379
          ]
407 380
        },
408 381
        "nsid": {
409 382
          "type": "string",
410 383
          "format": "nsid"
411 384
        },
412 385
        "rkey": {
413 386
          "type": "string",
414 387
          "maxLength": 50,
415 -
          "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."
416 389
        },
417 390
        "check": {
418 391
          "type": "string",
419 392
          "const": "field"
420 393
        },
421 394
        "field": {
422 395
          "type": "string",
423 396
          "maxLength": 200,
424 -
          "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."
425 398
        },
426 399
        "label": {
427 400
          "type": "string",
428 401
          "maxLength": 120
429 402
        },
403 +
        "value": {
404 +
          "type": "unknown",
405 +
          "description": "Comparison value."
406 +
        },
430 407
        "acquire": {
431 408
          "type": "string",
432 409
          "format": "uri"
433 -
        },
434 -
        "valueString": {
435 -
          "type": "string",
436 -
          "maxLength": 1000,
437 -
          "description": "String comparison value. For value-taking operators, set exactly one of valueString, valueInteger, or valueBoolean."
438 -
        },
439 -
        "valueBoolean": {
440 -
          "type": "boolean",
441 -
          "description": "Boolean comparison value."
442 -
        },
443 -
        "valueInteger": {
444 -
          "type": "integer",
445 -
          "description": "Integer comparison value. Use for numeric gt/gte/lt/lte checks."
446 410
        }
447 411
      },
448 -
      "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."
449 413
    },
450 414
    "party": {
451 415
      "type": "object",
452 416
      "required": [
453 417
        "name"
454 418
      ],
455 419
      "properties": {
456 420
        "did": {
457 421
          "type": "string",
458 422
          "format": "did",
459 -
          "description": "AT Protocol DID of this entity's account, if they have one. On an atmosphere.games-managed provisional definition, this is also the sole DID eligible to claim it by republishing with exact replaces[] lineage."
423 +
          "description": "DID of this entity's account, if it has one."
460 424
        },
461 425
        "url": {
462 426
          "type": "string",
463 427
          "format": "uri",
464 -
          "description": "Website for this entity."
428 +
          "description": "Website."
465 429
        },
466 430
        "name": {
467 431
          "type": "string",
468 432
          "maxLength": 100,
469 -
          "description": "Display name of the entity."
433 +
          "description": "Display name."
470 434
        }
471 435
      },
472 -
      "description": "A named entity (developer, publisher, studio) associated with the experience."
436 +
      "description": "An entity associated with the experience, such as its developer."
473 437
    },
474 438
    "video": {
475 439
      "type": "object",
476 440
      "required": [
477 441
        "title"
478 442
      ],
479 443
      "properties": {
480 444
        "url": {
481 445
          "type": "string",
482 446
          "format": "uri",
483 -
          "description": "Full URL to the video, used when no platform/videoId is given."
447 +
          "description": "Direct URL, used when no platform/videoId is given."
484 448
        },
485 449
        "title": {
486 450
          "type": "string",
487 451
          "maxLength": 120,
488 -
          "description": "Label for the clip (e.g. 'Launch Trailer')."
452 +
          "description": "Clip title."
489 453
        },
490 454
        "videoId": {
491 455
          "type": "string",
492 456
          "maxLength": 120,
493 -
          "description": "Platform video id (e.g. a YouTube id). Combined with 'platform' to build an embed."
457 +
          "description": "Platform video id."
494 458
        },
495 459
        "platform": {
496 460
          "type": "string",
497 -
          "description": "Where the video lives. 'direct' means the url points straight at a video file or page.",
461 +
          "description": "Where the video lives.",
498 462
          "knownValues": [
499 463
            "youtube",
500 464
            "vimeo",
501 465
            "twitch",
502 466
            "direct"
503 467
          ]
504 468
        },
505 469
        "thumbnail": {
506 470
          "type": "blob",
507 471
          "accept": [
508 472
            "image/png",
509 473
            "image/jpeg",
510 474
            "image/webp"
511 475
          ],
512 476
          "maxSize": 2000000,
513 -
          "description": "Optional still frame shown before the video plays."
477 +
          "description": "Still frame shown before playing."
514 478
        }
515 479
      },
516 -
      "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."
517 481
    },
518 482
    "vouch": {
519 483
      "type": "object",
520 484
      "required": [
521 485
        "check",
522 486
        "authority",
523 487
        "nsid"
524 488
      ],
525 489
      "properties": {
526 490
        "nsid": {
527 491
          "type": "string",
528 492
          "format": "nsid",
529 -
          "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."
530 494
        },
531 495
        "check": {
532 496
          "type": "string",
533 497
          "const": "vouch"
534 498
        },
535 499
        "label": {
536 500
          "type": "string",
537 501
          "maxLength": 120
538 502
        },
539 503
        "acquire": {
540 504
          "type": "string",
541 505
          "format": "uri"
542 506
        },
543 507
        "filters": {
544 508
          "type": "array",
545 509
          "items": {
546 510
            "ref": "#filter",
547 511
            "type": "ref"
548 512
          },
549 513
          "maxLength": 8,
550 -
          "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."
551 515
        },
552 516
        "authority": {
553 517
          "type": "string",
554 518
          "format": "did",
555 -
          "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."
556 520
        }
557 521
      },
558 -
      "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."
559 523
    },
560 524
    "filter": {
561 525
      "type": "object",
562 526
      "required": [
563 527
        "field",
564 528
        "op"
565 529
      ],
566 530
      "properties": {
567 531
        "op": {
568 532
          "type": "string",
569 -
          "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.",
570 534
          "knownValues": [
571 535
            "exists",
572 536
            "notExists",
573 -
            "isViewer",
537 +
            "isPlayer",
574 538
            "eq",
575 539
            "neq",
576 540
            "gt",
577 541
            "gte",
578 542
            "lt",
579 543
            "lte"
580 544
          ]
581 545
        },
582 546
        "field": {
583 547
          "type": "string",
584 548
          "maxLength": 200,
585 549
          "description": "Dot-path to the field."
586 550
        },
587 -
        "valueString": {
588 -
          "type": "string",
589 -
          "maxLength": 1000,
590 -
          "description": "String comparison value. For value-taking operators, set exactly one typed value property."
591 -
        },
592 -
        "valueBoolean": {
593 -
          "type": "boolean",
594 -
          "description": "Boolean comparison value."
595 -
        },
596 -
        "valueInteger": {
597 -
          "type": "integer",
598 -
          "description": "Integer comparison value. Use for numeric gt/gte/lt/lte checks."
551 +
        "value": {
552 +
          "type": "unknown",
553 +
          "description": "Comparison value."
599 554
        }
600 555
      },
601 -
      "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."
602 557
    },
603 558
    "record": {
604 559
      "type": "object",
605 560
      "required": [
606 561
        "check",
607 562
        "nsid"
608 563
      ],
609 564
      "properties": {
610 565
        "nsid": {
611 566
          "type": "string",
612 567
          "format": "nsid",
613 -
          "description": "Collection to check on the player's PDS (e.g. 'actor.rpg.sprite')."
568 +
          "description": "Collection to check."
614 569
        },
615 570
        "check": {
616 571
          "type": "string",
617 572
          "const": "record"
618 573
        },
619 574
        "label": {
620 575
          "type": "string",
621 576
          "maxLength": 120,
622 -
          "description": "Human-readable requirement shown when gated (e.g. 'An rpg.actor sprite')."
577 +
          "description": "Why this is required."
623 578
        },
624 579
        "acquire": {
625 580
          "type": "string",
626 581
          "format": "uri",
627 -
          "description": "URL to send players who fail, so they can fulfil the requirement."
582 +
          "description": "Where to get this."
628 583
        }
629 584
      },
630 -
      "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."
631 586
    },
632 587
    "matches": {
633 588
      "type": "object",
634 589
      "required": [
635 590
        "check",
636 591
        "nsid",
637 592
        "filters"
638 593
      ],
639 594
      "properties": {
640 595
        "nsid": {
641 596
          "type": "string",
642 597
          "format": "nsid"
643 598
        },
644 599
        "check": {
645 600
          "type": "string",
646 601
          "const": "matches"
647 602
        },
648 603
        "label": {
649 604
          "type": "string",
650 605
          "maxLength": 120
651 606
        },
652 607
        "acquire": {
653 608
          "type": "string",
654 609
          "format": "uri"
655 610
        },
656 611
        "filters": {
657 612
          "type": "array",
658 613
          "items": {
659 614
            "ref": "#filter",
660 615
            "type": "ref"
661 616
          },
662 617
          "maxLength": 8,
663 618
          "minLength": 1,
664 -
          "description": "All filters must match on the same record (AND semantics within one record)."
619 +
          "description": "All filters must match on the same record."
665 620
        }
666 621
      },
667 -
      "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."
668 623
    },
669 624
    "mediaItem": {
670 625
      "type": "object",
671 626
      "required": [
672 627
        "image"
673 628
      ],
674 629
      "properties": {
675 630
        "alt": {
676 631
          "type": "string",
677 632
          "maxLength": 300,
678 -
          "description": "Accessibility caption describing the image."
633 +
          "description": "Accessibility caption."
679 634
        },
680 635
        "type": {
681 636
          "type": "string",
682 -
          "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.",
683 638
          "knownValues": [
684 639
            "screenshot",
685 640
            "banner",
686 641
            "artwork",
687 642
            "poster",
688 643
            "background",
689 644
            "logo",
690 645
            "thumbnail"
691 646
          ]
692 647
        },
693 648
        "image": {
694 649
          "type": "blob",
695 650
          "accept": [
696 651
            "image/png",
697 652
            "image/jpeg",
698 653
            "image/webp",
699 654
            "image/gif"
700 655
          ],
701 656
          "maxSize": 8000000,
702 -
          "description": "The image blob, stored on the developer's PDS."
657 +
          "description": "The image blob."
703 658
        },
704 659
        "width": {
705 660
          "type": "integer",
706 -
          "description": "Pixel width, if known, lets portals reserve layout space before the blob loads."
661 +
          "description": "Pixel width, if known."
707 662
        },
708 663
        "height": {
709 664
          "type": "integer",
710 665
          "description": "Pixel height, if known."
711 666
        }
712 667
      },
713 -
      "description": "One image in the experience's media gallery."
668 +
      "description": "One image in the media gallery."
714 669
    },
715 -
    "reference": {
670 +
    "recordUse": {
716 671
      "type": "object",
717 672
      "required": [
718 673
        "role",
719 674
        "nsid"
720 675
      ],
721 676
      "properties": {
722 677
        "nsid": {
723 678
          "type": "string",
724 679
          "format": "nsid",
725 680
          "description": "Collection to read."
726 681
        },
727 682
        "path": {
728 683
          "type": "string",
729 684
          "maxLength": 200,
730 -
          "description": "Optional dot-path to the relevant payload within the record, e.g. 'clunscannon' inside actor.rpg.stats/self."
685 +
          "description": "Dot-path to the relevant value inside the record."
731 686
        },
732 687
        "rkey": {
733 688
          "type": "string",
734 689
          "maxLength": 50,
735 -
          "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."
736 691
        },
737 692
        "role": {
738 693
          "type": "string",
739 -
          "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.",
694 +
          "description": "What this record is used for.",
740 695
          "knownValues": [
741 -
            "activity",
696 +
            "character",
697 +
            "perk",
698 +
            "cosmetic",
699 +
            "interop",
742 700
            "stats",
701 +
            "activity",
743 702
            "leaderboard",
744 -
            "save",
745 -
            "replay",
703 +
            "profile",
746 704
            "session",
747 -
            "profile",
748 705
            "inventory",
749 -
            "grant",
750 -
            "validation",
751 -
            "label",
752 706
            "other"
753 707
          ]
754 708
        },
755 709
        "label": {
756 710
          "type": "string",
757 711
          "maxLength": 120,
758 -
          "description": "Human label for this reference."
712 +
          "description": "Short label for this use."
759 713
        },
760 714
        "verify": {
761 715
          "ref": "#rule",
762 716
          "type": "ref",
763 -
          "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."
764 718
        },
765 719
        "acquire": {
766 720
          "type": "string",
767 721
          "format": "uri",
768 -
          "description": "Optional URL where a player can create 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."
722 +
          "description": "Where to create or manage this record."
778 723
        },
779 724
        "filters": {
780 725
          "type": "array",
781 726
          "items": {
782 727
            "ref": "#filter",
783 728
            "type": "ref"
784 729
          },
785 730
          "maxLength": 8,
786 -
          "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."
787 732
        },
788 733
        "purpose": {
789 734
          "type": "string",
790 735
          "maxLength": 300,
791 -
          "description": "Why a portal or game reads this data."
736 +
          "description": "Why this record matters."
792 737
        },
793 738
        "authority": {
794 739
          "type": "string",
795 740
          "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."
741 +
          "description": "DID of the repo holding this record, if not the player's own."
797 742
        }
798 743
      },
799 -
      "description": "A non-gating record surface relevant to stats, saves, leaderboards, activity, sessions, replays, validation, labels, grants, inventory, profile enrichment, or other portal-readable context. A reference is a recipe for reading and presenting records. It is not an eligibility rule and not a promise that the game gives the player a benefit for owning that record. Put play gates in requires[] and optional gameplay integrations in includes[]."
744 +
      "description": "An optional record this game reads or writes. Not required to play; see requires[] for hard gates."
800 745
    },
801 746
    "catalogRef": {
802 747
      "type": "object",
803 748
      "required": [
804 749
        "uri"
805 750
      ],
806 751
      "properties": {
807 752
        "uri": {
808 753
          "type": "string",
809 754
          "format": "at-uri",
810 -
          "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."
811 756
        },
812 757
        "name": {
813 758
          "type": "string",
814 759
          "maxLength": 100,
815 -
          "description": "Display name of the referenced entry, so portals can show it without resolving the record."
760 +
          "description": "Display name of the referenced entry."
816 761
        },
817 762
        "borrow": {
818 763
          "type": "array",
819 764
          "items": {
820 765
            "type": "string",
821 766
            "knownValues": [
822 767
              "media",
823 768
              "trailers",
824 769
              "genres",
825 770
              "platforms",
826 771
              "releases",
827 772
              "ratings",
828 773
              "description",
829 774
              "summary"
830 775
            ]
831 776
          },
832 777
          "maxLength": 8,
833 -
          "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."
834 779
        },
835 780
        "source": {
836 781
          "type": "string",
837 782
          "maxLength": 60,
838 -
          "description": "Short label for the catalog this points at (e.g. 'pentaract')."
783 +
          "description": "Short name of the catalog."
839 784
        }
840 785
      },
841 -
      "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."
842 -
    },
843 -
    "lexiconRef": {
844 -
      "type": "object",
845 -
      "required": [
846 -
        "nsid"
847 -
      ],
848 -
      "properties": {
849 -
        "nsid": {
850 -
          "type": "string",
851 -
          "format": "nsid"
852 -
        },
853 -
        "verify": {
854 -
          "ref": "#rule",
855 -
          "type": "ref",
856 -
          "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."
857 -
        },
858 -
        "acquire": {
859 -
          "type": "string",
860 -
          "format": "uri",
861 -
          "description": "Optional URL where a player can obtain this record."
862 -
        },
863 -
        "purpose": {
864 -
          "type": "string",
865 -
          "maxLength": 200,
866 -
          "description": "The player-visible benefit this record unlocks or enriches when present. Shown to players."
867 -
        }
868 -
      },
869 -
      "description": "An optional player-facing record collection this game can use when present. This is about gameplay behavior or player benefit, not portal analytics. Example: an rpg.actor sprite can appear in the game, or an equipment item can unlock a bonus. 'verify' may inspect the player's record or an issuer-controlled grant collection so portals can badge whether the benefit is available."
870 -
    },
871 -
    "referenceDisplay": {
872 -
      "type": "object",
873 -
      "required": [
874 -
        "key",
875 -
        "label",
876 -
        "path"
877 -
      ],
878 -
      "properties": {
879 -
        "key": {
880 -
          "type": "string",
881 -
          "maxLength": 80,
882 -
          "description": "Stable metric key within this definition, e.g. 'bestDistance'."
883 -
        },
884 -
        "path": {
885 -
          "type": "string",
886 -
          "maxLength": 200,
887 -
          "description": "Dot-path to the value, relative to the reference path when set."
888 -
        },
889 -
        "unit": {
890 -
          "type": "string",
891 -
          "maxLength": 20,
892 -
          "description": "Unit suffix such as 'm', 'XP', or 'pts'."
893 -
        },
894 -
        "label": {
895 -
          "type": "string",
896 -
          "maxLength": 80,
897 -
          "description": "Short label shown before or beside the value."
898 -
        },
899 -
        "format": {
900 -
          "type": "string",
901 -
          "description": "Presentation hint for the value.",
902 -
          "knownValues": [
903 -
            "string",
904 -
            "integer",
905 -
            "number",
906 -
            "distance",
907 -
            "percent",
908 -
            "duration",
909 -
            "datetime",
910 -
            "boolean"
911 -
          ]
912 -
        },
913 -
        "divideBy": {
914 -
          "type": "integer",
915 -
          "minimum": 1,
916 -
          "description": "Integer divisor applied before display, e.g. divideBy 10 for decimeters to meters."
917 -
        },
918 -
        "priority": {
919 -
          "type": "integer",
920 -
          "description": "Lower numbers display first."
921 -
        },
922 -
        "aggregate": {
923 -
          "type": "string",
924 -
          "description": "How to reduce multiple records. Defaults to 'first' for fixed rkey records and 'count' for collection scans.",
925 -
          "knownValues": [
926 -
            "first",
927 -
            "count",
928 -
            "max",
929 -
            "min",
930 -
            "sum",
931 -
            "latest",
932 -
            "exists"
933 -
          ]
934 -
        },
935 -
        "multiplyBy": {
936 -
          "type": "integer",
937 -
          "description": "Integer multiplier applied before display. Use with divideBy for rational scaling."
938 -
        },
939 -
        "maximumFractionDigits": {
940 -
          "type": "integer",
941 -
          "maximum": 6,
942 -
          "minimum": 0,
943 -
          "description": "Decimal precision for numeric display."
944 -
        }
945 -
      },
946 -
      "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."
947 787
    }
948 788
  },
949 789
  "$type": "com.atproto.lexicon.schema",
950 790
  "lexicon": 1,
951 -
  "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."
952 792
}

Compare Other Versions

Lexicon Garden

@