ory/kratos · error
message ID is used more than once
Error message
message ID %s is used more than once: %s %s
What it means
After sorting all message constants from text/id.go by their ID value, validateAllMessages found two adjacent entries with the identical ID. Two distinct message constants share one identifier, which would make error messages ambiguous in generated documentation.
Solutions
- Give each of the two named constants its own unique ID value in text/id.go
- Use the generator's normal creation flow for new messages so IDs are assigned freshly
- Re-run the doc generation to verify no duplicates remain
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at cmd/clidoc/main.go:409 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ory/kratos@b86338da04 (2026-09-07).
Data as JSON: /api/errors/dc05e4073b348f23.
Report an issue: GitHub.
Appendix: source
Thrown at cmd/clidoc/main.go:409
usedIDs = append(usedIDs, message{
ID: c.(*types.Const).Val().ExactString(),
Name: name.Name,
})
}
}
}
}
}
}
}
}
sort.Slice(usedIDs, func(i, j int) bool {
return usedIDs[i].ID < usedIDs[j].ID
})
for i := 1; i < len(usedIDs); i++ {
if usedIDs[i].ID == usedIDs[i-1].ID {
return errors.Errorf("message ID %s is used more than once: %s %s", usedIDs[i].ID, usedIDs[i].Name, usedIDs[i-1].Name)
}
}
return nil
}
func generateElements(messageFilePath string) error {
// If the file at messageFilePath does not exist, create it
f, err := os.OpenFile(messageFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) // #nosec
if err != nil {
return errors.Wrapf(err, "unable to open or create message file at %s", messageFilePath)
}
if err := f.Close(); err != nil {
return errors.Wrapf(err, "unable to close message file at %s", messageFilePath)
}
sortedMessages := sortMessages()
if err := writeMessagesJson(messageFilePath, sortedMessages); err != nil {View on GitHub (pinned to b86338da04)