semaphoreui/semaphore · error

type not found

Error message

type %s not found

What it means

Returned by ExporterChain.getLoadedKeys in services/export/Exporter.go when the requested entity type name has no registered TypeExporter in the chain's exporters map. It is a generic lookup guard: the name string passed by the caller (e.g. 'project', 'user', a template or integration type) does not match any exporter registered on the chain, so the keys for that type cannot be enumerated.

Solutions

  1. Use an exporter type name that is actually registered in the chain (check the chain setup/registry)
  2. Verify spelling and casing of the name argument against the registered exporters
  3. Update the export/import code if the entity type was renamed in a newer version

Example fix

// before
keys, err := chain.getLoadedKeys("projectt", scope) // typo
// after
keys, err := chain.getLoadedKeys("project", scope)
Defensive patterns

Strategy: try-catch

Validate before calling

if _, ok := chain.exporters[name]; !ok {
    return fmt.Errorf("type %s is not registered", name)
}

Try / catch

keys, err := chain.getLoadedKeys(name, scope)
if err != nil {
    if strings.HasSuffix(err.Error(), "not found") {
        return nil // type not part of this export run
    }
    return err
}

Prevention

When it happens

Trigger: Calling ExporterChain.getLoadedKeys(name, scope) with a type name string that was never registered in the chain's exporters map (p.exporters[name] miss).

Common situations: Typo in the exporter type name; requesting keys for an entity type excluded from the current export configuration; version skew where a type was renamed between Semaphore versions.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of semaphoreui/semaphore@1774ccb71a (2026-09-07). Data as JSON: /api/errors/75164a293c50d24a. Report an issue: GitHub.

Appendix: source

Thrown at services/export/Exporter.go:326

		}
	}

	return nil
}

type ExporterChain struct {
	exporters map[string]TypeExporter
	KeyMapper
}

func (p *ExporterChain) getTypeExporter(name string) TypeExporter {
	return p.exporters[name]
}

func (p *ExporterChain) getLoadedKeys(name string, scope string) ([]EntityKey, error) {
	exporter, ok := p.exporters[name]
	if !ok {
		return nil, fmt.Errorf("type %s not found", name)
	}

	return exporter.getLoadedKeys(scope)
}

func (p *ExporterChain) getLoadedKeysInt(name string, scope string) ([]int, error) {
	exporter, ok := p.exporters[name]
	if !ok {
		return nil, fmt.Errorf("type %s not found", name)
	}

	keys, err := exporter.getLoadedKeys(scope)
	if err != nil {
		return nil, err
	}

	out := make([]int, len(keys))
	for i, v := range keys {

View on GitHub (pinned to 1774ccb71a)