Analyst Assignment¶
Analyst assignment keeps a roster of who is on duty in the lookup socfw_on_duty and gives each unassigned open case an owner from that roster, least-loaded first, so a case that needs a person has one within minutes of being starred.
1. What it does¶
Two scripts run from the job SOCFW Analyst Assignment every five minutes:
| Step | Script | What it does |
|---|---|---|
| Sync the roster | SOCFWOnDutySync |
Asks every configured schedule source who is on duty through the action soc-sync-on-duty (PagerDuty ships; others join the same action), and keeps socfw_on_duty in step: each source owns and replaces only its own rows. With no schedule source set up, the tenant's own users fill the roster by role or user group. analysts=<emails> sets a manual list for a tenant with no schedule system. |
| Assign cases | SOCFWAnalystSelect |
Picks unassigned open cases in the configured domains and window (starred only, with the shipped setting), re-reads each one just before acting, and assigns it through the action soc-assign-case to the on-duty analyst holding the fewest open cases, never above the per-analyst cap, and only to analysts logged in when online_only is set. |
The lookup is created by the first sync and never wiped. A schedule source that errors, is not configured or answers with nobody changes nothing. A role or group setting that matches no tenant user removes the fallback rows, so the roster never silently keeps people a changed setting no longer names. The framework assigns a case once and never replaces an owner.
2. Where the switch lives¶
| Where | Key | Shipped default | Evaluation | Production |
|---|---|---|---|---|
Job SOCFW Analyst Assignment |
!SOCFWConfig command=job, command=owner |
off, placeholder owner | on, with a real owner (mode=pov turns it on) |
on |
SOCFrameworkActions_V3 → soc-assign-case |
shadow_mode_by_actor.automation |
shadow for every actor | live for automation in mode=pov |
live for automation once the shadow rows show the right people |
SOCFWTenantConfig → assignment |
roles, groups, cases, domains, window, max_per_analyst, online_only (set with !SOCFWConfig command=assignment) |
not set; the shipped values below apply | groups set to the analyst group |
same, plus cases=all where every open case should have an owner |
SOCOptimizationConfig_V3 → Analyst Assignment JOB |
AssignmentRoles, AssignmentGroups, AssignmentCases, AssignmentDomains, AssignmentWindow, AssignmentMaxPerAnalyst, AssignmentOnlineOnly, AssignmentMethod |
Instance Administrator,Account Admin · (none) · starred · security · 24 hours · 20 · true · least_loaded |
read only; the tenant section above overrides it | read only |
SOCFWTenantConfig → PagerDuty v2 |
schedule_ids (!SOCFWConfig command=set) |
not set | set when the customer uses PagerDuty | same |
The shipped role fallback is the two admin roles, because every tenant has them. Most customers set
groupsto their analyst group androles=nonebefore turning the job on, so the roster is the people who work cases.
3. Turn it on¶
-
See the settings in force and where each comes from:
-
Point the fallback at the analysts (a comma list; quote names with spaces), and read the dry run:
-
Apply it.
defaultreturns a setting to the shipped value;noneturns the role or group fallback off: -
Set the job's owner and turn it on:
-
Leave
soc-assign-caseshadowed for a day and read the rows (step 4 below). When the people and cases are right, take it live for the job's actor:
4. Verify¶
config timeframe = 24h
| dataset = xsiam_socfw_ir_execution_raw
| filter event_type in ("on_duty_sync", "analyst_assignment")
| fields _time, event_type, action_actor, case_id, assignee, status, on_duty_count, on_duty_added, on_duty_removed, execution_mode
| sort desc _time
Expected: one on_duty_sync row per run naming what each source added and removed, and one analyst_assignment row per case decision with the assignee and execution_mode shadow (simulated) or production (assigned). !SOCFWHealthCheck shows Analyst assignment roster with the count per source, and warns when the roster comes only from the role fallback, naming command=assignment as the fix.
5. What it feeds¶
| Surface | What you see |
|---|---|
Lookup socfw_on_duty |
Who is on duty now, with the source that put them there and when |
Dataset xsiam_socfw_ir_execution_raw |
on_duty_sync rows (roster changes over time), analyst_assignment rows (every decision with each analyst's load at that moment), config_change rows for every setting applied |
!SOCFWHealthCheck |
The roster, its sources, and the job's state and owner |
!SOCFWConfig command=status |
The assignment settings with their source (shipped or tenant) |
| The case | An owner, set once; the War Room entry names the action and the actor |
Verified against soc-optimization-unified 3.31.2 source (SOCFWOnDutySync, SOCFWAnalystSelect, SOCFWConfig, the job playbook and the lists) · Tenant run: 2026-11-03 · Internal mapping: Notion, Capability Reference row Analyst assignment JOB + on-duty roster