Fix crew worker mail identity mismatch (gt-2xiv)

Normalize crew/ and polecats/ to canonical form in addressToIdentity():
- gastown/crew/dave -> gastown/dave
- gastown/polecats/Toast -> gastown/Toast

Follows Postels Law: be liberal in what you accept.
This commit is contained in:
Steve Yegge
2025-12-22 00:40:02 -08:00
parent ed089cbd17
commit ebbe886d81
2 changed files with 34 additions and 14 deletions

View File

@@ -276,13 +276,17 @@ func ParseMessageType(s string) MessageType {
// addressToIdentity converts a GGT address to a beads identity.
//
// Addresses use slash format matching directory structure:
// Liberal normalization: accepts multiple address formats and normalizes
// to canonical form (Postel's Law - be liberal in what you accept).
//
// Addresses use slash format:
// - "mayor/" → "mayor/"
// - "mayor" → "mayor/"
// - "deacon/" → "deacon/"
// - "deacon" → "deacon/"
// - "gastown/polecats/Toast" → "gastown/polecats/Toast"
// - "gastown/crew/max" → "gastown/crew/max"
// - "gastown/polecats/Toast" → "gastown/Toast" (normalized)
// - "gastown/crew/max" → "gastown/max" (normalized)
// - "gastown/Toast" → "gastown/Toast" (already canonical)
// - "gastown/refinery" → "gastown/refinery"
// - "gastown/" → "gastown" (rig broadcast)
func addressToIdentity(address string) string {
@@ -299,17 +303,25 @@ func addressToIdentity(address string) string {
address = address[:len(address)-1]
}
// Keep slashes - addresses map to directory structure
// Normalize crew/ and polecats/ to canonical form:
// "rig/crew/name" → "rig/name"
// "rig/polecats/name" → "rig/name"
parts := strings.Split(address, "/")
if len(parts) == 3 && (parts[1] == "crew" || parts[1] == "polecats") {
return parts[0] + "/" + parts[2]
}
return address
}
// identityToAddress converts a beads identity back to a GGT address.
//
// Identity format matches address format (slash-based):
// Liberal normalization (Postel's Law):
// - "mayor/" → "mayor/"
// - "deacon/" → "deacon/"
// - "gastown/polecats/Toast" → "gastown/polecats/Toast"
// - "gastown/crew/max" → "gastown/crew/max"
// - "gastown/polecats/Toast" → "gastown/Toast" (normalized)
// - "gastown/crew/max" → "gastown/max" (normalized)
// - "gastown/Toast" → "gastown/Toast" (already canonical)
// - "gastown/refinery" → "gastown/refinery"
func identityToAddress(identity string) string {
// Town-level agents ensure trailing slash
@@ -320,6 +332,11 @@ func identityToAddress(identity string) string {
return "deacon/"
}
// Identity already in slash format, return as-is
// Normalize crew/ and polecats/ to canonical form
parts := strings.Split(identity, "/")
if len(parts) == 3 && (parts[1] == "crew" || parts[1] == "polecats") {
return parts[0] + "/" + parts[2]
}
return identity
}

View File

@@ -13,9 +13,11 @@ func TestAddressToIdentity(t *testing.T) {
{"deacon", "deacon/"},
{"deacon/", "deacon/"},
// Rig-level agents: slash format matches directory structure
{"gastown/polecats/Toast", "gastown/polecats/Toast"},
{"gastown/crew/max", "gastown/crew/max"},
// Rig-level agents: crew/ and polecats/ normalized to canonical form
{"gastown/polecats/Toast", "gastown/Toast"},
{"gastown/crew/max", "gastown/max"},
{"gastown/Toast", "gastown/Toast"}, // Already canonical
{"gastown/max", "gastown/max"}, // Already canonical
{"gastown/refinery", "gastown/refinery"},
{"gastown/witness", "gastown/witness"},
@@ -44,9 +46,10 @@ func TestIdentityToAddress(t *testing.T) {
{"deacon", "deacon/"},
{"deacon/", "deacon/"},
// Rig-level agents: identity == address (slash format)
{"gastown/polecats/Toast", "gastown/polecats/Toast"},
{"gastown/crew/max", "gastown/crew/max"},
// Rig-level agents: crew/ and polecats/ normalized
{"gastown/polecats/Toast", "gastown/Toast"},
{"gastown/crew/max", "gastown/max"},
{"gastown/Toast", "gastown/Toast"}, // Already canonical
{"gastown/refinery", "gastown/refinery"},
{"gastown/witness", "gastown/witness"},