diff --git a/internal/mail/router.go b/internal/mail/router.go
--- a/internal/mail/router.go
+++ b/internal/mail/router.go
@@ -330,8 +330,29 @@ func agentBeadToAddress(bead *agentBead) string {
 	}
 
 	// Handle gt- prefixed IDs (legacy format)
-	if !strings.HasPrefix(id, "gt-") {
-		return "" // Not a valid agent bead ID
+	// Handle rig-specific prefixes: <prefix>-<rig>-<role>-<name>
+	// Examples: j-java-crew-americano -> java/crew/americano
+	idParts := strings.Split(id, "-")
+	if len(idParts) >= 3 {
+		for i, part := range idParts {
+			if part == "crew" || part == "polecat" || part == "polecats" {
+				if i >= 1 && i < len(idParts)-1 {
+					rig := idParts[i-1]
+					name := strings.Join(idParts[i+1:], "-")
+					return rig + "/" + part + "/" + name
+				}
+			}
+			if part == "witness" || part == "refinery" {
+				if i >= 1 {
+					return idParts[i-1] + "/" + part
+				}
+			}
+		}
+	}
+
+	// Handle gt- prefixed IDs (legacy format)
+	if !strings.HasPrefix(id, "gt-") {
+		return "" // Not a valid agent bead ID
 	}
 
 	// Strip prefix
