code: func (b BuilderID) Split() (backend, backendGroup, builderName string, err error) {
  	toks := strings.SplitN(string(b), "/", 3)
  	if len(toks) != 3 {
  		err = errors.Reason("bad BuilderID: not enough tokens: %q", b).
  			Tag(grpcutil.InvalidArgumentTag).Err()
  		return
  	}
  	backend, backendGroup, builderName = toks[0], toks[1], toks[2]
  	switch backend {
  	case "buildbot", "buildbucket":
  	default:
  		err = errors.Reason("bad BuilderID: unknown backend %q", backend).
  			Tag(grpcutil.InvalidArgumentTag).Err()
  		return
  	}
  	if backendGroup == "" {
  		err = errors.New("bad BuilderID: empty backendGroup", grpcutil.InvalidArgumentTag)
  		return
  	}
  	if builderName == "" {
  		err = errors.New("bad BuilderID: empty builderName", grpcutil.InvalidArgumentTag)
  		return
  	}
  	return
  }
docs: // Split breaks the BuilderID into pieces.
  //   - backend is either 'buildbot' or 'buildbucket'
  //   - backendGroup is either the bucket or master name
  //   - builderName is the builder name.
  //
  // Returns an error if the BuilderID is malformed (wrong # slashes) or if any of
  // the pieces are empty.