···2727 },
2828 "manifestDigest": {
2929 "type": "string",
3030- "description": "DEPRECATED: Digest of the manifest (e.g., 'sha256:...'). Kept for backward compatibility with old records. New records should use 'manifest' field instead."
3030+ "description": "DEPRECATED: Digest of the manifest (e.g., 'sha256:...'). Kept for backward compatibility with old records. New records should use 'manifest' field instead.",
3131+ "maxLength": 128
3132 },
3233 "createdAt": {
3334 "type": "string",
+9-17
pkg/auth/oauth/client.go
···7272 return baseURL + "/auth/oauth/callback"
7373}
74747575-// GetDefaultScopes returns the default OAuth scopes for ATCR registry operations
7676-// testMode determines whether to use transition:generic (test) or rpc scopes (production)
7575+// GetDefaultScopes returns the default OAuth scopes for ATCR registry operations.
7676+// Uses io.atcr.permissions#registry permission-set to bundle repo and rpc scopes.
7777+// Blob scopes are listed explicitly (not supported in Lexicon permission-sets).
7778func GetDefaultScopes(did string) []string {
7878- scopes := []string{
7979+ return []string{
7980 "atproto",
8080- // Used for service token validation on holds
8181- "rpc:com.atproto.repo.getRecord?aud=*",
8181+ // Permission-set bundles repo and rpc scopes
8282+ // See lexicons/io/atcr/authFullApp.json for definition
8383+ "io.atcr.authFullApp",
8484+ // Blob scopes (not supported in Lexicon permission-sets)
8285 // Image manifest types (single-arch)
8386 "blob:application/vnd.oci.image.manifest.v1+json",
8487 "blob:application/vnd.docker.distribution.manifest.v2+json",
···8790 "blob:application/vnd.docker.distribution.manifest.list.v2+json",
8891 // OCI artifact manifests (for cosign signatures, SBOMs, attestations)
8992 "blob:application/vnd.cncf.oras.artifact.manifest.v1+json",
9090- // image avatars
9393+ // Image avatars
9194 "blob:image/*",
9295 }
9393-9494- // Add repo scopes
9595- scopes = append(scopes,
9696- fmt.Sprintf("repo:%s", atproto.ManifestCollection),
9797- fmt.Sprintf("repo:%s", atproto.TagCollection),
9898- fmt.Sprintf("repo:%s", atproto.StarCollection),
9999- fmt.Sprintf("repo:%s", atproto.SailorProfileCollection),
100100- fmt.Sprintf("repo:%s", atproto.RepoPageCollection),
101101- )
102102-103103- return scopes
10496}
1059710698// ScopesMatch checks if two scope lists are equivalent (order-independent)