{ "schemas": { "ProjectMember": { "type": "object", "additionalProperties": false, "required": [ "party_id", "roles", "asserted_name", "asserted_name_revision" ], "properties": { "party_id": { "type": "string", "format": "uuid" }, "roles": { "type": "array", "maxItems": 2, "uniqueItems": true, "items": { "type": "string", "enum": [ "developer", "project-administrator" ] } }, "asserted_name": { "type": "string", "nullable": true, "maxLength": 1024, "description": "Current trusted AAI name. Null when unavailable or absent; no profile or email fallback." }, "asserted_name_revision": { "type": "integer", "nullable": true, "minimum": 1, "maximum": 9007199254740991, "description": "Independent identity-attributes revision. Null when no current qualified projection is available; may be present when asserted_name is null." } } }, "ProjectMembers": { "type": "object", "additionalProperties": false, "required": [ "project_id", "revision", "items", "pending_member_count", "membership_complete" ], "properties": { "project_id": { "type": "string", "format": "uuid" }, "revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991, "description": "Project membership revision; does not version asserted names." }, "items": { "type": "array", "maxItems": 256, "items": { "$ref": "schemas.json#/schemas/ProjectMember" } }, "pending_member_count": { "type": "integer", "minimum": 0, "maximum": 256, "description": "Unresolved or no longer qualified member bindings. Diagnostic information, never an invitation count." }, "membership_complete": { "type": "boolean", "description": "True exactly when pending_member_count is zero. Names do not affect roster completeness." } } }, "ProjectInvitation": { "type": "object", "additionalProperties": false, "required": [ "invitation_id", "recipient_email", "roles", "state", "expires_at" ], "properties": { "invitation_id": { "type": "string", "minLength": 1, "maxLength": 256, "description": "Opaque invitation reference; grants no acceptance authority." }, "recipient_email": { "type": "string", "format": "email", "maxLength": 320 }, "roles": { "type": "array", "minItems": 1, "maxItems": 2, "uniqueItems": true, "items": { "type": "string", "enum": [ "developer", "project-administrator" ] } }, "state": { "type": "string", "enum": [ "pending" ] }, "expires_at": { "type": "string", "format": "date-time" } } }, "ProjectInvitations": { "type": "object", "additionalProperties": false, "required": [ "project_id", "project_revision", "read_at", "items" ], "properties": { "project_id": { "type": "string", "format": "uuid" }, "project_revision": { "type": "integer", "minimum": 1, "maximum": 9007199254740991, "description": "Project revision whose administrator authority was checked; does not version invitations." }, "read_at": { "type": "string", "format": "date-time", "description": "Completion time of the successful complete read; the provider supplies no atomic collection revision." }, "items": { "type": "array", "maxItems": 256, "description": "Complete pending, unexpired Project invitations, ordered by expires_at then invitation_id. Overflow or incomplete provider reads fail with 503.", "items": { "$ref": "schemas.json#/schemas/ProjectInvitation" } } } }, "Error": { "type": "object", "additionalProperties": false, "required": [ "code" ], "properties": { "code": { "type": "string" } } } } }