{"record":{"id":"17ed58e7ec79b61b","repo":"gastownhall/beads","slug":"peer-name-too-long-max-64-characters-17ed58","errorCode":null,"errorMessage":"peer name too long (max 64 characters)","messagePattern":"peer name too long \\(max 64 characters\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/issueops/federation.go","lineNumber":22,"sourceCode":"\t\"context\"\n\t\"database/sql\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/steveyegge/beads/internal/storage\"\n)\n\n// validPeerNameRegex matches valid peer names (alphanumeric, hyphens, underscores).\nvar validPeerNameRegex = regexp.MustCompile(`^[a-zA-Z][a-zA-Z0-9_-]*$`)\n\n// ValidatePeerName checks that a peer name is safe for use as a Dolt remote name.\nfunc ValidatePeerName(name string) error {\n\tif name == \"\" {\n\t\treturn fmt.Errorf(\"peer name cannot be empty\")\n\t}\n\tif len(name) > 64 {\n\t\treturn fmt.Errorf(\"peer name too long (max 64 characters)\")\n\t}\n\tif !validPeerNameRegex.MatchString(name) {\n\t\treturn fmt.Errorf(\"peer name must start with a letter and contain only alphanumeric characters, hyphens, and underscores\")\n\t}\n\treturn nil\n}\n\n// AddFederationPeerInTx upserts a federation peer record. The encryptedPwd\n// should already be encrypted by the caller; pass nil for no password.\nfunc AddFederationPeerInTx(ctx context.Context, tx *sql.Tx, peer *storage.FederationPeer, encryptedPwd []byte) error {\n\tif err := ValidatePeerName(peer.Name); err != nil {\n\t\treturn fmt.Errorf(\"invalid peer name: %w\", err)\n\t}\n\n\t_, err := tx.ExecContext(ctx, `\n\t\tINSERT INTO federation_peers (name, remote_url, username, password_encrypted, sovereignty)\n\t\tVALUES (?, ?, ?, ?, ?)\n\t\tON DUPLICATE KEY UPDATE","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/issueops/federation.go#L4-L40","documentation":"ValidatePeerName enforces a maximum length of 64 characters for federation peer names because they are used as Dolt remote names. Names longer than 64 characters are rejected with this error. This also keeps remote names manageable in Dolt config output.","triggerScenarios":"Calling ValidatePeerName or AddFederationPeerInTx with a name whose len(name) > 64 — e.g. a full URL, hostname with long path, or a generated UUID-prefixed identifier used verbatim as the peer name.","commonSituations":"Passing a full remote URL or org/repo path as the peer name instead of a short label; machine-generated names like \"company-team-environment-region-replica-0001\" exceeding the limit.","solutions":["Shorten the peer name to 64 characters or fewer (use a short label like \"hq\" or \"replica-1\").","Keep the full address/URL in the peer's address field, not its name.","Pre-validate name length in your config loader before calling AddFederationPeerInTx."],"exampleFix":"// before\npeer := \"https://dolt.example.com/very-long-org/very-long-repo-name\"\nAddFederationPeerInTx(ctx, tx, peer, addr, nil)\n// after\npeer := \"example-replica-1\" // <= 64 chars, valid remote name\nAddFederationPeerInTx(ctx, tx, peer, addr, nil)","handlingStrategy":"validation","validationCode":"if len(name) > 64 {\n\treturn fmt.Errorf(\"peer name %q exceeds 64 chars (len=%d)\", name, len(name))\n}","typeGuard":"func validPeerName(name string) bool {\n\treturn len(name) > 0 && len(name) <= 64\n}","tryCatchPattern":"if err := ValidatePeerName(peer); err != nil {\n\treturn fmt.Errorf(\"peer %q rejected: %w (use a short label, keep URL in address)\", peer, err)\n}","preventionTips":["Use short labels (e.g. \"hq\", \"replica-1\") as peer names; store URLs in the address field.","Enforce a length cap in your config loader mirroring the 64-char limit.","Reject full URLs/hostnames at config parse time."],"tags":["validation","federation","peer-name","dolt"],"backgroundTag":"peer-name-invalid","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}