semaphoreui/semaphore · error
error at inventories
Error message
error at inventories[%d]: %s
What it means
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.
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
Defensive patterns
Strategy: validation
Validate before calling
for i, inv := range backup.Inventories {
if inv == nil || inv.Name == "" {
return fmt.Errorf("inventories[%d]: missing name before restore", i)
}
}
if err := backup.Verify(); err != nil {
return err
} Type guard
func validInventory(inv *InventoryBackup) bool { return inv != nil && inv.Name != "" } Try / catch
if err := backup.Verify(); err != nil {
if strings.Contains(err.Error(), "inventories[") {
// locate and fix the reported inventory index
}
return err
} Prevention
- Confirm inventory references (repository, secret) exist in the backup
- Always run Verify() before Restore
- Export and restore with matching Semaphore versions
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- error at keys[ ]
- error at repositories
- item does not exist
- item does not exist
- repository does not exist in repositories[].name
AI-assisted analysis of semaphoreui/semaphore@1774ccb71a (2026-09-07).
Data as JSON: /api/errors/d1db788374d8f367.
Report an issue: GitHub.
Appendix: source
Thrown at services/project/restore.go:563
}
for i, o := range backup.Schedules {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at templates[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Keys {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at keys[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Repositories {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at repositories[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Inventories {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at inventories[%d]: %s", i, err.Error())
}
}
for i, o := range backup.SecretStorages {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at secret storage[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Templates {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at templates[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Roles {
if err := o.Verify(backup); err != nil {
return fmt.Errorf("error at roles[%d]: %s", i, err.Error())
}
}
for i, o := range backup.Runners {View on GitHub (pinned to 1774ccb71a)