function inspectIdentifierForDirectMembershipChain(
    variableName,
    identifierNode,
    parents
  ) {
    /** @type {import('../../core/src/schema').GlobalPolicyValue} */
    let identifierUse = 'read'
    const { memberExpressions, parentOfMembershipChain, topmostMember } =
      getMemberExpressionNesting(identifierNode, parents)
    // determine if used in an assignment expression
    // @ts-ignore - FIXME needs logic changes for type safety
    const isAssignment = parentOfMembershipChain.type === 'AssignmentExpression'
    // @ts-ignore - FIXME needs logic changes for type safety
    const isAssignmentTarget = parentOfMembershipChain.left === topmostMember
    if (isAssignment && isAssignmentTarget) {
      // this membership chain is being assigned to
      identifierUse = 'write'
    }
    // if not used in any member expressions AND is not a global ref, expose as is
    if (!memberExpressions.length) {
      return {
        identifierUse,
        path: [variableName],
        parent: parentOfMembershipChain,
      }
    }
    const path = [
      variableName,
      ...getPathFromMemberExpressionChain(memberExpressions),
    ]
    return { identifierUse, path, parent: parentOfMembershipChain }
  }
@param {string} variableName
@param {import('@babel/types').Identifier
  | import('@babel/types').ThisExpression} identifierNode
@param {import('./inspectPrimordialAssignments').MemberLikeExpression[]} parents
@returns