eTeamUps Matching Algorithm – V1

The eTeamUps matching algorithm scores how well a candidate fits an existing team across 16 workstyle dimensions. Each dimension measures a different behavioral trait (teamwork, conscientiousness, conflict style, values, etc.) using Likert-scale survey responses.

The algorithm produces:

  • A per-dimension score (0-100%) for each of the 16 scored dimensions
  • A score category (LOW / MEDIUM / HIGH) for each dimension
  • A weighted overall score combining all dimensions

The Scoring Pipeline

Raw Answers
    |
    v
Pre-processing (exclude faking, apply reverse scoring)
    |
    v
Per-Dimension Scoring (6 different calculator types)
    |
    v
Score Categorization (LOW < 33 <= MEDIUM < 66 <= HIGH)
    |
    v
Weighted Aggregation (overall = sum(score * weight) / sum(weight))

Step 1: Pre-processing

Before any scoring, two transformations are applied to raw survey answers:

Faking Question Exclusion

Eight questions are flagged as “faking detectors” – extreme statements like “Working in teams is always the most effective way to work” that no honest respondent would strongly agree with. These questions are excluded from all scoring calculations. They exist only to detect dishonest respondents.

Faking questions: Q26, Q41, Q54, Q61, Q87, Q99, Q113, Q131.

Reverse Scoring

Some questions are phrased in the opposite direction of what the dimension measures. For example, in the Teamwork dimension (where higher = more team-oriented), the question “I like to do things my own way” is reverse-scored. The raw answer value is flipped:

Raw Value Effective Value
1 5
2 4
3 3
4 2
5 1

This ensures all questions within a dimension point in the same direction.

Step 2: Per-Dimension Scoring

Each of the 16 scored dimensions uses one of 6 calculator types. The calculator type determines the mathematical formula used to produce the 0-100% score.

Mean Computation

For most calculator types, the first step is computing the effective mean for each person on that dimension:

  1. Take the person’s answers for all questions in the dimension’s question group
  2. Exclude faking questions
  3. Apply reverse scoring where flagged
  4. Compute the arithmetic mean of the remaining effective values

This gives a value between 1.0 and 5.0 for each person.

Step 3: Categorization

Every score percentage is rounded to the nearest integer and categorized:

Score Range Category
< 33 LOW
33 – 65 MEDIUM
>= 66 HIGH

Step 4: Weighted Aggregation

The overall score for a candidate-team pair is a weighted average:

overall = sum(scorePercentage[i] * weight[i]) / sum(weight[i])

Weights are either 100 (full weight) or 50 (half weight), assigned per dimension. See the Data Reference for the complete weight table.


Calculator Types

SUPPLEMENTARY – Team Similarity

Used by: Work Expectation, Task Relation, Time Urgency, Work Ethic

Concept: Teams work best when members are similar on this trait. A candidate who makes the team more homogeneous scores higher.

Formula:

theoreticalMaxStdDev = sampleStdDev(half 1s and half 5s for teamSize+1 items)

newTeamData = [teamMember1Mean, teamMember2Mean, ..., candidateMean]
newTeamStdDev = sampleStdDev(newTeamData)

score = 100 - (newTeamStdDev / theoreticalMaxStdDev * 100)

The theoretical maximum standard deviation represents the worst case (maximally dispersed team). Dividing by it normalizes the score to 0-100. Subtracting from 100 inverts it so that lower deviation = higher score.

:::info
Standard deviation uses the sample formula (divides by n-1, not n) to match the Apache Commons Math library used in the original Java implementation.
:::

Example: If the existing team has work expectation means of [3.5, 3.5, 3.5] and a candidate also has 3.5, the new team stddev is 0 and the score is 100% (perfect similarity).


COMPLEMENTARY – Team Diversity

Used by: Assertiveness

Concept: Teams work best when members have diverse levels of this trait. A candidate who increases spread scores higher.

Formula:

theoreticalMaxStdDev = sampleStdDev(half 1s and half 5s for teamSize+1 items)

newTeamData = [teamMember1Mean, teamMember2Mean, ..., candidateMean]
newTeamStdDev = sampleStdDev(newTeamData)

score = newTeamStdDev / theoreticalMaxStdDev * 100

Same as SUPPLEMENTARY but without the 100 - inversion. Higher stddev = higher score.

Example: For assertiveness, a team of all moderate scorers (3.0) benefits from a candidate who is either very assertive (5.0) or very deferential (1.0).


MAX_MEAN – Higher is Better

Used by: Teamwork, Goal Priority, Conscientiousness, Learn Orientation, Agreeableness, Intellect

Concept: Higher team average on this trait is desirable. A candidate who raises the team mean scores higher.

Formula:

newTeamMean = mean([teamMember1Mean, ..., candidateMean])

score = (newTeamMean - 1) / (5 - 1) * 100

This linearly maps the 1-5 Likert scale to 0-100%:

  • Mean of 1.0 = 0%
  • Mean of 3.0 = 50%
  • Mean of 5.0 = 100%

MIN_MEAN – Lower is Better

Used by: Reliance, Performance Prove, Performance Avoid

Concept: Lower team average on this trait is desirable. A candidate who lowers the team mean scores higher.

Formula:

newTeamMean = mean([teamMember1Mean, ..., candidateMean])

score = 100 - ((newTeamMean - 1) / (5 - 1) * 100)

Same as MAX_MEAN but inverted. A mean of 1.0 gives 100%, a mean of 5.0 gives 0%.

Example: For Performance Avoid (tendency to avoid challenging work), lower scores are better. A candidate with a mean of 1.5 pushes the team mean down and gets a high score.


TOP_TEN – Values Overlap

Used by: Values (QG1)

Concept: Measures how much a candidate’s top values overlap with the team’s top values. More shared values = better fit.

Algorithm:

  1. For each person, find their top 5 values: answers scored > 3, sorted by value descending (ties broken by question ID descending), take the first 5.

  2. For the team, aggregate all members’ top 5 lists. Rank questions by how many team members selected them. The top 5 most-selected questions become the team’s top values.

  3. Score is based on how many of the team’s top values the candidate also selected:

calcScore(usersSharing) = 4 * (usersSharing - 1)

rawScore = sum of calcScore for each of the 5 team top values
           (counting the candidate as an additional user if they overlap)

score = (rawScore - minPossibleScore) / (maxPossibleScore - minPossibleScore) * 100

Where maxPossibleScore = 5 * calcScore(teamSize + 1) (everyone shares all top values) and minPossibleScore distributes users as evenly as possible across all questions.

Example:

  • Team top values: Q15 (results), Q6 (ethics), Q16 (collaboration), Q1 (reliability), Q2 (honesty)
  • Candidate top values: Q1 (reliability), Q2 (honesty), Q9 (creativity), Q15 (results), Q16 (collaboration)
  • Overlap: Q15, Q6… wait, Q6 is not in candidate’s top values. Overlap = Q15, Q16, Q1, Q2 = 4 out of 5

GROUP_AVERAGE – Conflict Style

Used by: Conflict v2 (QG18)

Concept: Each person has a dominant conflict style determined from 16 conflict-related questions. Problem-Solving (PS) is the best style, Compromise (Comp) is good, and the rest (Yield, Force, Avoid) score zero.

Algorithm:

  1. Group the 16 conflict questions by sub-group (metadata field):

    • ConflictYield (4 questions)
    • ConflictForce (4 questions)
    • ConflictComp (2 questions)
    • ConflictPS (3 questions)
    • ConflictAvoid (3 questions)
  2. Compute each sub-group’s answer sum divided by the total question count (16, not the sub-group’s own count). The sub-group with the highest score is the person’s dominant conflict style. (This matches the Java implementation where all sub-group sums are divided by the same denominator, so it is effectively a raw-sum comparison.)

  3. Map the dominant style to a numeric score:

Dominant Style Score
Problem-Solving (PS) 13
Compromise (Comp) 7
Yield 0
Force 0
Avoid 0
  1. Normalize:
teamSum = sum of all team members' conflict scores
newSum = teamSum + candidateScore
maxPossible = (teamSize + 1) * 13

score = (newSum / maxPossible) * 100

Example: If a 3-person team has conflict scores [13, 7, 13] (two PS, one Comp), teamSum = 33. A PS-dominant candidate adds 13. newSum = 46, maxPossible = 4 * 13 = 52. Score = 46/52 * 100 = 88.5%.


Worked Example: Dave Petrov vs Engineering Core

Engineering Core is a 3-person team: Alice Rivera (Tech Lead), Bob Chen (Senior Developer), Carol Okafor (DevOps Engineer).

Dave Petrov is a Full-Stack Developer candidate.

Team Baselines

Dimension                  Type             Weight   Baseline
────────────────────────── ──────────────── ──────── ────────────────
values                     TOP_TEN          100%     40.0% MEDIUM
teamwork                   MAX_MEAN         100%     63.0% MEDIUM
workexpectation            SUPPLEMENTARY    100%     100.0% HIGH
reliance                   MIN_MEAN         100%     45.8% MEDIUM
goalpriority               MAX_MEAN         100%     71.7% HIGH
taskrelation               SUPPLEMENTARY    100%     75.0% HIGH
timeurgency                SUPPLEMENTARY    100%     85.7% HIGH
workethic                  SUPPLEMENTARY    100%     89.3% HIGH
conscientiousness          MAX_MEAN         100%     70.8% HIGH
learnorientation           MAX_MEAN         50%      75.0% HIGH
assertiveness              COMPLEMENTARY    100%     21.7% LOW
agreeableness              MAX_MEAN         100%     70.8% HIGH
performanceprove           MIN_MEAN         50%      41.7% MEDIUM
performanceavoid           MIN_MEAN         50%      30.0% LOW
intellect                  MAX_MEAN         100%     75.0% HIGH
conflict-v2                GROUP_AVERAGE    50%      84.6% HIGH

Dave’s Dimension Scores

values (TOP) [weight: 100%]
  Team top:      Q15, Q6, Q16, Q1, Q2
  Candidate top: Q1, Q2, Q15, Q16, Q9
  Overlap: 4/5 [Q15, Q6... actually Q1, Q2, Q15, Q16]
  Score: 53.3% MEDIUM

teamwork (MAX) [weight: 100%]
  Team mean: 3.519  |  Candidate mean: 4.222  |  New mean: 3.694  |  StdDev: 0.451
  Score: 67.4% HIGH

workexpectation (SUP) [weight: 100%]
  Team mean: 3.500  |  Candidate mean: 3.000  |  New mean: 3.375  |  StdDev: 0.250
  Score: 89.2% HIGH

conflict-v2 (CAVG) [weight: 50%]
  Team mean: 11.000  |  Candidate mean: 13.000  |  New mean: 11.500
  Score: 88.5% HIGH

Overall Result

┌────────────────────────────────────────────────────────────┐
│  Dave Petrov vs Engineering Core -- Overall: 70.4% HIGH    │
└────────────────────────────────────────────────────────────┘

Candidate Comparison

The algorithm scores all candidates against each team and produces a comparison:

── Engineering Core -- Candidate Comparison ────────────────────────

  Dimension                  Wt    Dave Petrov        Eve Tanaka         Sam Reyes
  ────────────────────────── ───── ────────────────── ────────────────── ──────────────────
  values (TOP)               100%  53.3% MEDIUM       26.7% LOW          46.7% MEDIUM
  teamwork (MAX)             100%  67.4% HIGH         53.5% MEDIUM       63.2% MEDIUM
  workexpectation (SUP)      100%  89.2% HIGH         89.2% HIGH         100.0% HIGH
  reliance (MIN)             100%  59.4% MEDIUM       46.9% MEDIUM       56.3% MEDIUM
  goalpriority (MAX)         100%  76.3% HIGH         60.0% MEDIUM       70.0% HIGH
  taskrelation (SUP)         100%  78.3% HIGH         67.5% HIGH         79.3% HIGH
  timeurgency (SUP)          100%  82.2% HIGH         67.9% HIGH         87.6% HIGH
  workethic (SUP)            100%  82.2% HIGH         58.9% MEDIUM       89.3% HIGH
  conscientiousness (MAX)    100%  71.9% HIGH         62.5% MEDIUM       68.8% HIGH
  learnorientation (MAX)     50%   78.1% HIGH         65.6% HIGH         71.9% HIGH
  assertiveness (COMP)       100%  20.9% LOW          28.5% LOW          17.7% LOW
  agreeableness (MAX)        100%  75.0% HIGH         62.5% MEDIUM       68.8% HIGH
  performanceprove (MIN)     50%   62.5% MEDIUM       53.1% MEDIUM       56.3% MEDIUM
  performanceavoid (MIN)     50%   73.8% HIGH         58.8% MEDIUM       67.5% HIGH
  intellect (MAX)            100%  78.1% HIGH         65.6% HIGH         71.9% HIGH
  conflict-v2 (CAVG)         50%   88.5% HIGH         63.5% MEDIUM       76.9% HIGH
  ────────────────────────── ───── ────────────────── ────────────────── ──────────────────
  OVERALL                          70.4% HIGH         57.9% MEDIUM       68.3% HIGH

  Recommendation for Engineering Core:
  >> 1. Dave Petrov: 70.4% HIGH
     2. Sam Reyes: 68.3% HIGH
     3. Eve Tanaka: 57.9% MEDIUM

Grand Summary

When multiple teams are evaluated, a final grand summary shows which candidate is the best fit for each:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  GRAND SUMMARY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

                         Dave Petrov          Eve Tanaka           Sam Reyes
  ────────────────────── ──────────────────── ──────────────────── ────────────────────
  Engineering Core       70.4% HIGH           57.9% MEDIUM         68.3% HIGH
  Growth Squad           68.4% HIGH           51.7% MEDIUM         62.5% MEDIUM
  ────────────────────── ──────────────────── ──────────────────── ────────────────────

  Best Matches:
    Engineering Core -> Dave Petrov (70.4% HIGH)
    Growth Squad -> Dave Petrov (68.4% HIGH)

Key Design Decisions

  1. Sample standard deviation (n-1) is used instead of population (n) to match the Apache Commons Math DescriptiveStatistics class used in the original Java implementation.

  2. Faking questions are excluded before any mean calculation. They are never part of scoring, only social-desirability detection.

  3. Reverse scoring is applied at the individual answer level, not the group mean level. Each flagged question’s raw value is flipped before aggregation.

  4. Theoretical max stddev is calculated dynamically based on team size, not hardcoded. This ensures correct normalization regardless of team size.

  5. TOP_TEN actually uses top 5, not top 10. The enum name is a legacy artifact from the Java codebase.

  6. GROUP_AVERAGE conflict scoring is binary per sub-group – only the dominant sub-group matters, and only PS (13) and Comp (7) contribute positive scores.


Beyond Workstyle — Role Match, Combined Scoring & Compare

V1 above only covers workstyle (16 dimensions). The platform also ships:

  • Role Match — scores a candidate’s experience and goals against a RoleSpecification.
  • Combined Score — blends role + workstyle into a single 0–100 score.
  • Individual Compare — pairwise / mutual comparison between two candidates.

These are exposed via POST /evaluation/{id}/team-match and POST /evaluation/compare. Full algorithm details are in Role Match & Combined Scoring. UI wiring guides: Admin, HUB.