{"record":{"id":"7be71daec37e8857","repo":"semaphoreui/semaphore","slug":"error-at-secret-storage-d-s","errorCode":null,"errorMessage":"error at secret storage[%d]: %s","messagePattern":"error at secret storage\\[(.+?)\\]: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"services/project/restore.go","lineNumber":568,"sourceCode":"\t}\n\tfor i, o := range backup.Keys {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at keys[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Repositories {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at repositories[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Inventories {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at inventories[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.SecretStorages {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at secret storage[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Templates {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at templates[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Roles {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at roles[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Runners {\n\t\tif err := o.Verify(backup); err != nil {\n\t\t\treturn fmt.Errorf(\"error at runners[%d]: %s\", i, err.Error())\n\t\t}\n\t}\n\tfor i, o := range backup.Workflows {","sourceCodeStart":550,"sourceCodeEnd":586,"githubUrl":"https://github.com/semaphoreui/semaphore/blob/1774ccb71a0a8b82eb74ea24c23ac9ab713de2fa/services/project/restore.go#L550-L586","documentation":"This error wraps a per-item failure from BackupFormat.Verify() while validating backup.SecretStorages: the secret storage object at index i failed o.Verify(backup). A secret storage entry in the backup is invalid, so verification aborts and restore never starts.","triggerScenarios":"Calling BackupFormat.Verify() where the secret storage at backup.SecretStorages[i] fails Verify — e.g. missing name/type, or shared/connection parameters referencing storages absent from the backup.","commonSituations":"Backups exported from an instance using a different secret backend (e.g. Vault vs internal) and restored elsewhere; schema changes between Semaphore versions; hand-edited backup files dropping referenced storages.","solutions":["Read the inner error after 'secret storage[i]:' for the exact validation failure","Fix or remove the secret storage entry at that index in the backup","Confirm the target Semaphore instance supports the secret storage type in the backup","Re-export the backup from the source instance instead of editing manually"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"for i, ss := range backup.SecretStorages {\n    if ss == nil || ss.Name == \"\" || ss.Type == \"\" {\n        return fmt.Errorf(\"secret storage[%d]: missing name/type before restore\", i)\n    }\n}\nif err := backup.Verify(); err != nil {\n    return err\n}","typeGuard":"func validSecretStorage(ss *SecretStorageBackup) bool { return ss != nil && ss.Name != \"\" && ss.Type != \"\" }","tryCatchPattern":"if err := backup.Verify(); err != nil {\n    if strings.Contains(err.Error(), \"secret storage[\") {\n        // fix the secret storage entry at the parsed index\n    }\n    return err\n}","preventionTips":["Ensure the target instance supports the backup's secret storage types","Run Verify() before Restore","Avoid hand-editing secret storage sections in backups"],"tags":["backup","validation","secrets","restore"],"backgroundTag":"schema-validation-failed","analyzedSha":"1774ccb71a0a8b82eb74ea24c23ac9ab713de2fa","analyzedAt":"2026-09-07T11:00:33.293Z","contentChangedAt":"2026-09-07T11:00:33.293Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}