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