games.atmosphere.define
Schema Diff
+104 -350
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
}