From
bafyreiforigy5s65meyirawwafzivbzod6syryksqupxee2fhhu3667kzu
indexed 2026-09-24 19:21 UTC
View this version
To
bafyreiaeuvabxfgip7yqk5wx3cvdcpj3xyya5efmxpxomhfa3whzljh7ea
indexed 2026-11-05 16:25 UTC
View this version
Compatibility
breaking 13 breaking changes, 10 non-breaking changes.
Breaking changes (13)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "fyi.opensocial.provisionGroup:input", src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientId", kind: "prop", name: Some("clientId") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "fyi.opensocial.provisionGroup:input", src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_id", kind: "prop", name: Some("client_id") }
- RemovedVertex RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_assertion" }
- RemovedVertex RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_assertion_type" }
- RemovedVertex RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_id" }
- RemovedEdge RemovedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_assertion", kind: "prop", name: Some("client_assertion") }
- RemovedEdge RemovedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_assertion_type", kind: "prop", name: Some("client_assertion_type") }
- KindChanged KindChanged { vertex_id: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", old_kind: "string", new_kind: "ref" }
- KindChanged KindChanged { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", old_kind: "string", new_kind: "ref" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", sort: "ref", value: "fyi.opensocial.defs#accountRef" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", sort: "ref", value: "fyi.opensocial.defs#audience" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.scope", sort: "maxLength", value: "2048" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.joinPolicy", sort: "knownValues", value: "[\"fyi.opensocial.profile#open\",\"fyi.opensocial.profile#request\",\"fyi.opensocial.profile#invite\"]" }
Non-breaking changes (10)
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.defs#accountRef" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.defs#audience" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientAssertion" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientAssertionType" }
- AddedVertex AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientId" }
- AddedEdge AddedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientAssertion", kind: "prop", name: Some("clientAssertion") }
- AddedEdge AddedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientAssertionType", kind: "prop", name: Some("clientAssertionType") }
- AddedEdge AddedEdge { src: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", tgt: "fyi.opensocial.defs#audience", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "fyi.opensocial.provisionGroup:input.stewards:items", tgt: "fyi.opensocial.defs#accountRef", kind: "ref", name: None }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", sort: "format" }
Migration guidance
Removed
RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_assertion" }RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_assertion_type" }RemovedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.client_id" }
Added
AddedVertex { vertex_id: "fyi.opensocial.defs#accountRef" }AddedVertex { vertex_id: "fyi.opensocial.defs#audience" }AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientAssertion" }AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientAssertionType" }AddedVertex { vertex_id: "fyi.opensocial.provisionGroup:input.clientId" }
Constraint changes
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.scope", sort: "maxLength", value: "2048" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", sort: "ref", value: "fyi.opensocial.defs#accountRef" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", sort: "ref", value: "fyi.opensocial.defs#audience" }
- ConstraintAdded ConstraintAdded { vertex_id: "fyi.opensocial.provisionGroup:input.joinPolicy", sort: "knownValues", value: "[\"fyi.opensocial.profile#open\",\"fyi.opensocial.profile#request\",\"fyi.opensocial.profile#invite\"]" }
- ConstraintRemoved ConstraintRemoved { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", sort: "format" }
Notes
- Breaking: RequiredEdgeAdded { vertex_id: "fyi.opensocial.provisionGroup:input", src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientId", kind: "prop", name: Some("clientId") }
- Breaking: RequiredEdgeRemoved { vertex_id: "fyi.opensocial.provisionGroup:input", src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_id", kind: "prop", name: Some("client_id") }
- Breaking: RemovedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_assertion", kind: "prop", name: Some("client_assertion") }
- Breaking: RemovedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.client_assertion_type", kind: "prop", name: Some("client_assertion_type") }
- Breaking: KindChanged { vertex_id: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", old_kind: "string", new_kind: "ref" }
- Breaking: KindChanged { vertex_id: "fyi.opensocial.provisionGroup:input.stewards:items", old_kind: "string", new_kind: "ref" }
- Non-breaking: AddedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientAssertion", kind: "prop", name: Some("clientAssertion") }
- Non-breaking: AddedEdge { src: "fyi.opensocial.provisionGroup:input", tgt: "fyi.opensocial.provisionGroup:input.clientAssertionType", kind: "prop", name: Some("clientAssertionType") }
- Non-breaking: AddedEdge { src: "fyi.opensocial.provisionGroup:input.metaReadableBy:items", tgt: "fyi.opensocial.defs#audience", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "fyi.opensocial.provisionGroup:input.stewards:items", tgt: "fyi.opensocial.defs#accountRef", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"main": {55
"description": "Host-level: an app creates a group for a person and gets its own OAuth session on it. Authenticated twice: the person asking, by service auth from their PDS (they become the founder), and the app, by OAuth client authentication in the body (a client assertion for a confidential client) with a DPoP proof in the `DPoP` header, exactly as at the token endpoint. The app must be one this host provisions for. Returns the group and a token response bound to the proof's key, issued to the app's client id: refreshed, listed and revoked like any other session on the group.",66
"errors": [77
{88
"name": "UntrustedApp"99
},1010
{1111
"name": "InvalidScope"1212
},1313
{1414
"name": "use_dpop_nonce"1515
},1616
{1717
"name": "HandleTaken"1818
}1919
],2020
"input": {2121
"encoding": "application/json",2222
"schema": {2323
"properties": {24
"client_assertion": {24
"clientAssertion": {25
"maxLength": 8192,2526
"type": "string"2627
},27
"client_assertion_type": {28
"clientAssertionType": {29
"maxLength": 256,2830
"type": "string"2931
},30
"client_id": {32
"clientId": {33
"description": "The app's OAuth client id, its client metadata's URL.",34
"maxLength": 2048,3135
"type": "string"3236
},3337
"description": {3438
"maxGraphemes": 300,3539
"maxLength": 3000,3640
"type": "string"3741
},3842
"displayName": {3943
"maxGraphemes": 64,4044
"maxLength": 640,4145
"type": "string"4246
},4347
"handle": {4448
"format": "handle",4549
"type": "string"4650
},4751
"joinPolicy": {52
"knownValues": [53
"fyi.opensocial.profile#open",54
"fyi.opensocial.profile#request",55
"fyi.opensocial.profile#invite"56
],4857
"type": "string"4958
},5059
"metaReadableBy": {5160
"items": {52
"type": "string"61
"ref": "fyi.opensocial.defs#audience",62
"type": "ref"5363
},5464
"type": "array"5565
},5666
"scope": {5767
"description": "The OAuth scope the app wants on the group. Must include `atproto`, and every entry must be one the app's client metadata declares.",68
"maxLength": 2048,5869
"type": "string"5970
},6071
"stewards": {6172
"description": "Accounts that run the group alongside the founder.",6273
"items": {63
"format": "did",64
"type": "string"74
"ref": "fyi.opensocial.defs#accountRef",75
"type": "ref"6576
},6677
"type": "array"6778
}6879
},6980
"required": [7081
"handle",7182
"displayName",7283
"scope",73
"client_id"84
"clientId"7485
],7586
"type": "object"7687
}7788
},7889
"output": {7990
"encoding": "application/json",8091
"schema": {8192
"properties": {8293
"did": {8394
"format": "did",8495
"type": "string"8596
},8697
"members": {8798
"format": "space-ref",8899
"type": "string"89100
},90101
"meta": {91102
"format": "space-ref",92103
"type": "string"93104
},94105
"session": {95106
"description": "An OAuth token response (access_token, token_type, refresh_token, expires_in, scope, sub), as /oauth/token returns it.",96107
"type": "unknown"97108
}98109
},99110
"required": [100111
"did",101112
"meta",102113
"members",103114
"session"104115
],105116
"type": "object"106117
}107118
},108119
"type": "procedure"109120
}110121
},111122
"id": "fyi.opensocial.provisionGroup",112123
"lexicon": 1113124
}