checkRemotableProtoOf = (original, check) => {
  isObject(original) ||
    Fail`Remotables must be objects or functions: ${original}`;

  // A valid remotable object must inherit from a "tag record" -- a
  // plain-object prototype consisting of only
  // a `PASS_STYLE` property with value "remotable" and a suitable `Symbol.toStringTag`
  // property. The remotable could inherit directly from such a tag record, or
  // it could inherit from another valid remotable, that therefore itself
  // inherits directly or indirectly from such a tag record.
  //
  // TODO: It would be nice to typedef this shape, but we can't declare a type
  // with PASS_STYLE from JSDoc.
  //
  // @type {{ [PASS_STYLE]: string,
  //          [Symbol.toStringTag]: string,
  //        }}
  //
  const proto = getPrototypeOf(original);
  if (
    proto === objectPrototype ||
    proto === null ||
    proto === Function.prototype
  ) {
    return (
      !!check &&
      CX(check)`Remotables must be explicitly declared: ${q(original)}`
    );
  }

  if (typeof original === 'object') {
    const protoProto = getPrototypeOf(proto);
    if (protoProto !== objectPrototype && protoProto !== null) {
      // eslint-disable-next-line no-use-before-define
      return checkRemotable(proto, check);
    }
    if (!checkTagRecord(proto, 'remotable', check)) {
      return false;
    }
  } else if (typeof original === 'function') {
    if (!checkFunctionTagRecord(proto, 'remotable', check)) {
      return false;
    }
  }

  // Typecasts needed due to https://github.com/microsoft/TypeScript/issues/1863
  const passStyleKey = /** @type {unknown} */ (PASS_STYLE);
  const tagKey = /** @type {unknown} */ (Symbol.toStringTag);
  const {
    // checkTagRecord already verified PASS_STYLE and Symbol.toStringTag own data properties.
    [/** @type {string} */ (passStyleKey)]: _passStyleDesc,
    [/** @type {string} */ (tagKey)]: { value: iface },
    ...restDescs
  } = getOwnPropertyDescriptors(proto);

  return (
    (ownKeys(restDescs).length === 0 ||
      (!!check &&
        CX(
          check,
        )`Unexpected properties on Remotable Proto ${ownKeys(restDescs)}`)) &&
    checkIface(iface, check)
  );
}
@param {object | Function} original
@param {Checker} [check]
@returns {boolean}