My team and I develop software that our customers will use to interact with their customers.  Additionally, we also eat our own dogfood and use the software ourselves to interact with our customers.

Therefore, it can sometimes be difficult to explain use cases and scenarios, as our employees can be operators, our customers can be operators, and our customers' customers can be visitors.

However, our customers can also be visitors interacting with our operator employees, our customers' customers can be visitors interacting with our customer or our employee.

Here is a model where:

A is an employee
B is a customer
C is our customers' customer

X  interacts with  Y
Operator --&gt; Visitor
      A  --&gt;  B
      A  --&gt;  C
      B  --&gt;  C


Because sometimes our customers can play different roles, it's sometimes necessary to refer to the specific role, Operator or Visitor, instead of Employee and Customer.

It's also a mouthful to say "customer's customer" all the time.

I was wondering how other development shops handle these semantic details when writing their use cases and scenarios.  


Are there any one-word, generic terms that can apply to any product that involves a third-level actor?
Other than using the specific roles, Operator and Visitor, what words could be used to identify a customer of a customer?  


The word would need to be short enough as to be adopted within an organization.  If longer than a couple syllables, it's shortened form must still differentiate it from the other actors.


Question: Comparing gold standard csv file and extracted values csv files in Python
Answer: Disclaimer: My approach uses the pandas library.

First, data set-up.

gold_std.csv

id,description,amount,date
1,Some description.,$150.54,12/12/2012
2,Some other description.,$200,10/10/2015
3,Other description.,$25,11/11/2014
4,My description,$11.35,01/01/2015
5,Your description.,$20,03/03/2013


extract1.csv

id,description,date
1,Some description.,12/12/2012
2,Some other description.,10/10/2015
3,Other description.,11/11/2014
4,122333222233332221,11/11/2014
5,Your description.,03/03/2013


extract2.csv

id,description,amount,date
1,Some description.,$150.54,12/12/2012
2,Some other description.,$200,10/10/2015
3,Other description.,$25,11/11/2014
5,Your description.,$20,03/03/2013


Second, code.

import pandas as pd

def compare_extract(extract_name, reference='gold_std.csv'):

    gold = pd.read_csv(reference)
    ext = pd.read_csv(extract_name)

    gc = set(gold.columns)
    header = ext.columns
    extc = set(header)

    if gc != extc:
        missing = ", ".join(list(gc - extc))
        print "Extract has the following missing columns: {}".format(missing)
    else:
        print "Extract has the same column as standard. Checking for abberant rows..."
        gold_list = gold.values.tolist()
        ext_list = ext.values.tolist()
        # Somewhat non-pandaic approach because possible no same IDs so we're relying
        # on set operations instead. A bit hackish, actually.
        diff = list(set(map(tuple, gold_list)) - set(map(tuple, ext_list)))
        df = pd.DataFrame(diff, columns=header)
        print "The following rows are not in the extract: "
        print df


Third, test runs.

e1 = 'extract1.csv'
compare_extract(e1)
# Extract has the following missing columns: amount

e2 = 'extract2.csv'
compare_extract(e2)
# Extract has the same column as standard. Checking for abberant rows...
# The following rows are not in the extract: 
#    id     description  amount        date
# 0   4  My description  $11.35  01/01/2015


Finally, the last extract is a bit arbitrary. I think for that one you're better off writing a non-pandas algorithm.