{"record":{"id":"16d00383a560c621","repo":"larksuite/cli","slug":"metadata-authorization-identityorder-contains-unde","errorCode":null,"errorMessage":"Metadata.Authorization.IdentityOrder contains undeclared identity %q","messagePattern":"Metadata\\.Authorization\\.IdentityOrder contains undeclared identity %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shortcuts/common/typed_compiler.go","lineNumber":161,"sourceCode":"\t\t\t}\n\t\t\tif conditional.When != strings.TrimSpace(conditional.When) {\n\t\t\t\treturn fmt.Errorf(\"%s.When must be trimmed\", path)\n\t\t\t}\n\t\t\tswitch conditional.Requirement {\n\t\t\tcase typedScopeRequired, typedScopeBestEffort:\n\t\t\tdefault:\n\t\t\t\treturn fmt.Errorf(\"%s.Requirement %q is invalid\", path, conditional.Requirement)\n\t\t\t}\n\t\t}\n\t}\n\tif len(metadata.Authorization.IdentityOrder) > 0 {\n\t\tif len(metadata.Authorization.IdentityOrder) != len(metadata.Authorization.Identities) {\n\t\t\treturn fmt.Errorf(\"Metadata.Authorization.IdentityOrder must contain each declared identity exactly once\")\n\t\t}\n\t\tseen := make(map[typedIdentity]struct{}, len(metadata.Authorization.IdentityOrder))\n\t\tfor _, identity := range metadata.Authorization.IdentityOrder {\n\t\t\tif _, ok := metadata.Authorization.Identities[identity]; !ok {\n\t\t\t\treturn fmt.Errorf(\"Metadata.Authorization.IdentityOrder contains undeclared identity %q\", identity)\n\t\t\t}\n\t\t\tif _, duplicate := seen[identity]; duplicate {\n\t\t\t\treturn fmt.Errorf(\"Metadata.Authorization.IdentityOrder contains duplicate identity %q\", identity)\n\t\t\t}\n\t\t\tseen[identity] = struct{}{}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc validateScopeList(scopes []string, path string) error {\n\tseen := make(map[string]struct{}, len(scopes))\n\tfor i, scope := range scopes {\n\t\tif strings.TrimSpace(scope) == \"\" || scope != strings.TrimSpace(scope) {\n\t\t\treturn fmt.Errorf(\"%s[%d] must be a non-blank trimmed scope\", path, i)\n\t\t}\n\t\tif _, ok := seen[scope]; ok {\n\t\t\treturn fmt.Errorf(\"%s contains duplicate scope %q\", path, scope)","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/shortcuts/common/typed_compiler.go#L143-L179","documentation":"Compile-time guard in validateCommandMetadata: IdentityOrder names an identity not present in the Identities map.","triggerScenarios":"IdentityOrder includes e.g. \"bot\" while Identities map only declares \"user\"; a typo in the identity constant/name; deleting an identity from Identities but leaving it in IdentityOrder.","commonSituations":"Refactoring that removed an identity from Identities but not from the order slice; misspelled custom identity value; copying IdentityOrder from another command that declares more identities.","solutions":["Add the identity to Authorization.Identities with its authorization entry, or","Remove the undeclared identity from IdentityOrder","Fix typos so the order entry matches the exact identity key used in Identities"],"exampleFix":"// before\nIdentities: map[...]{User: {...}},\nIdentityOrder: []common.TypedIdentity{common.TypedIdentityUser, common.TypedIdentityBot},\n// after\nIdentities: map[...]{User: {...}},\nIdentityOrder: []common.TypedIdentity{common.TypedIdentityUser},","handlingStrategy":"validation","validationCode":"for _, id := range meta.Authorization.IdentityOrder { if _, ok := meta.Authorization.Identities[id]; !ok { return fmt.Errorf(\"undeclared identity %q\", id) } }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only reference identity constants also used as Identities map keys","Fix typos by reusing the same typed constant in both places","Remove stale order entries when deleting identities"],"tags":["go","validation","shortcut-compiler","authorization"],"backgroundTag":"schema-validation-failed","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}