Nothing decides assignments by machine learning out of the box, but BAW has the right hooks, and the data to train on already exists (PDW / BAI): task durations per person and activity, instance cycle times, business data.
- Best assignee: a team filter service (runs when the task is created) calls a prediction ("expected completion time per candidate") and returns the team narrowed to the best few members - the task still goes to a team, so claiming and absence handling keep working. The prediction can come from an ADS predictive model, a small model served through Open Prediction Service, or simply from statistics computed nightly from the PDW into a table.
- SLA risk: a timer or a step early in the instance calls a model ("probability of breaching the due date given amount, region, current backlog") and sets priority / due date accordingly; re-evaluate at milestones; escalate through the normal timer events.
- Workload balancing without ML: the filter service reads open task counts per member (REST search or SQL) and prefers the least loaded - often 80 % of the benefit.
// team filter service "Best approvers" - input team, request; output filteredTeam (top 3 by predicted handling time, fallback = whole team)
var candidates = [];
for (var i = 0; i < tw.local.team.members.listLength; i++) candidates.push(tw.local.team.members[i]);
tw.local.candidates = new tw.object.listOf.String();
for (var c = 0; c < candidates.length; c++) tw.local.candidates.insertIntoList(c, candidates[c]);
// next step: nested service flow "Predict handling time" (ADS / Open Prediction Service behind it): candidates + request in, scores out
// the prediction call is a nested service flow step in the filter service: inputs candidates (list of String), request; output scores (list of Score{user, hours})
// script after it:
var scores = [];
for (var i = 0; i < tw.local.scores.listLength; i++) scores.push({ user: tw.local.scores[i].user, hours: tw.local.scores[i].hours });
scores.sort(function (a, b) { return a.hours - b.hours; });
tw.local.filteredTeam = new tw.object.Team(); tw.local.filteredTeam.name = tw.local.team.name;
tw.local.filteredTeam.members = new tw.object.listOf.String();
var n = Math.min(3, scores.length);
for (var j = 0; j < n; j++) tw.local.filteredTeam.members.insertIntoList(j, scores[j].user);
if (n == 0) tw.local.filteredTeam.members = tw.local.team.members; // never return an empty team
// SLA risk step in the BPD (script after a prediction step): raise priority and shorten due date
if (tw.local.breachProbability > 0.6) { tw.local.priority = "High"; tw.local.dueInHours = 4; }Data for the model (nightly from PDW / BAI): per task - activity, assignee, claimed-to-completed hours, hour of day, business attributes; per instance - cycle time, breach flag. Start with a gradient boosting model or even a lookup table of medians per (activity, user); measure the effect with an A/B split by team before rolling out; keep humans able to override (a "route manually" option in the dashboard); and explain the routing in the task's narrative ("assigned by predicted handling time") so that people trust it. Keep the filter fast (one batched prediction call, cached statistics) - it runs on every task creation.
References