{"record":{"id":"d1db788374d8f367","repo":"semaphoreui/semaphore","slug":"error-at-inventories-d-s","errorCode":null,"errorMessage":"error at inventories[%d]: %s","messagePattern":"error at inventories\\[(.+?)\\]: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"services/project/restore.go","lineNumber":563,"sourceCode":"\t}\n\tfor i, o := range backup.Schedules {\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.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 {","sourceCodeStart":545,"sourceCodeEnd":581,"githubUrl":"https://github.com/semaphoreui/semaphore/blob/1774ccb71a0a8b82eb74ea24c23ac9ab713de2fa/services/project/restore.go#L545-L581","documentation":"This error wraps a per-item failure from BackupFormat.Verify() while validating backup.Inventories: the inventory at index i failed o.Verify(backup). The inventory entry is invalid (missing fields or broken references) so the whole backup fails pre-restore validation.","triggerScenarios":"Calling BackupFormat.Verify() where the inventory at backup.Inventories[i] fails Verify — e.g. missing name, invalid type, or a repository/secret reference that does not exist in the backup.","commonSituations":"Backups moved between Semaphore versions with changed inventory schema; hand-merged backups where an inventory points to a removed repository or key; manual JSON edits with typos in entity names.","solutions":["Read the inner error after 'inventories[i]:' to identify the failing field","Fix or remove the inventory entry at the reported index in the backup file","Ensure the referenced repository/secret entries exist earlier in the backup","Re-export the backup from the source instance to get a consistent file"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"for i, inv := range backup.Inventories {\n    if inv == nil || inv.Name == \"\" {\n        return fmt.Errorf(\"inventories[%d]: missing name before restore\", i)\n    }\n}\nif err := backup.Verify(); err != nil {\n    return err\n}","typeGuard":"func validInventory(inv *InventoryBackup) bool { return inv != nil && inv.Name != \"\" }","tryCatchPattern":"if err := backup.Verify(); err != nil {\n    if strings.Contains(err.Error(), \"inventories[\") {\n        // locate and fix the reported inventory index\n    }\n    return err\n}","preventionTips":["Confirm inventory references (repository, secret) exist in the backup","Always run Verify() before Restore","Export and restore with matching Semaphore versions"],"tags":["backup","validation","restore","go"],"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"}