From 87ee99bb8f2b4d3ae369c9316c5c251dfdb92b13 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 5 Dec 2025 01:15:18 +0000 Subject: [PATCH 01/56] add task for role assignment --- src/browsergym/workarena/tasks/role.py | 78 ++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/browsergym/workarena/tasks/role.py diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py new file mode 100644 index 0000000..5412a7e --- /dev/null +++ b/src/browsergym/workarena/tasks/role.py @@ -0,0 +1,78 @@ + +import playwright.sync_api +from typing import Tuple, List, Dict, Any +import requests + +class ServiceNowRoleTask(AbstractServiceNowTask): + """ + Generic task for role manipulation (create/edit) in a table using a Glide form. + """ + + def __init__(self, seed: int, config: Dict[str, Any]) -> None: + self.task_is_setup = False + self.config = config + self.timeout = 60000 + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # get instance info + instance_url = self.instance.snow_url + (snow_username, snow_password) = self.instance.snow_credentials + + # get relevant info from config + user_full_name = self.config["user_full_name"] + user_roles = self.config.get("roles", "admin") + user_roles = [role.strip() for role in user_roles.split(",")] + + # query instance to get user sys id + response = requests.get( + f"{instance_url}/api/now/table/sys_user", + auth=(snow_username, snow_password), + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"name={user_full_name}", + "sysparm_fields": "sys_id", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + record = response.json().get("result", []) + if not record: + return 0 + user_sys_id = record[0]["sys_id"] + + # query sys_user_has_role to find user roles + response = requests.get( + f"{instance_url}/api/now/table/sys_user_has_role", + auth=(snow_username, snow_password), + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"user={user_sys_id}", + "sysparm_display_value": "all", + "sysparm_fields": "role", + "sysparm_limit": 200, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + roles = [elem["role"]["display_value"] for elem in result] + for role in user_roles: + if not role in roles: + return 0 + return 1 + + def teardown(self) -> None: + # TODO: implement this (delete role for users) + pass \ No newline at end of file From 94a18bc11af1c329593f41251e35fc0be289ed20 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 5 Dec 2025 22:32:14 +0000 Subject: [PATCH 02/56] add role and case tasks for servicenow --- src/browsergym/workarena/tasks/case.py | 221 +++++++++++++++++++++++++ src/browsergym/workarena/tasks/role.py | 4 +- 2 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 src/browsergym/workarena/tasks/case.py diff --git a/src/browsergym/workarena/tasks/case.py b/src/browsergym/workarena/tasks/case.py new file mode 100644 index 0000000..f869747 --- /dev/null +++ b/src/browsergym/workarena/tasks/case.py @@ -0,0 +1,221 @@ +import playwright.sync_api +from typing import Tuple, List, Dict, Any +import requests +from .base import AbstractServiceNowTask + +from ..api.utils import ( + db_delete_from_table, + table_api_call, + table_column_info, + HTTPError, +) + +class ServiceNowCaseTask(AbstractServiceNowTask): + + + def __init__(self, seed: int, config: Dict[str, Any]) -> None: + super().__init__(seed) + self.task_is_setup = False + self.config = config + self.timeout = 60000 + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + goal = self.config["goal"] + info = self.config + return goal, info + + +class GetCaseStatusTask(ServiceNowCaseTask): + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + state = self.config["state"] + if state.lower() in chat_messages[-1]["content"].lower(): + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The state does match."}, + ) + return ( + 0, + False, + "", + {"message": "The state does not match."}, + ) + + +class CloseCaseTask(ServiceNowCaseTask): + + def __init__(self, seed: int, config: Dict[str, Any]) -> None: + super().__init__(seed, config) + + self.initial_state = table_api_call( + instance=self.instance, + table="sn_customerservice_case", + params={ + "sysparm_query": f"number={self.config['case_number']}", + "sysparm_fields": "state", + "sysparm_limit": 1, + }, + )["result"][0]["state"] + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # gather info from config + case_number = self.config["case_number"] + resolution_code = self.config["resolution_code"] + close_notes = self.config["close_notes"] + + # Query sn_customerservice_case in ServiceNow + record = table_api_call( + instance=self.instance, + table="sn_customerservice_case", + params={ + "sysparm_query": f"number={case_number}", + "sysparm_fields": "sys_id,number,resolution_code,close_notes", + "sysparm_limit": 1, + }, + )["result"] + + if not record: + return ( + 0, + False, + "", + {"message": "The record was not found in the database. Perhaps it was deleted."}, + ) + + # check for resolution_code and close_notes + if record[0]["resolution_code"] == resolution_code and record[0]["close_notes"] == close_notes: + # TODO: allow fuzzy match for close_notes + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully edited."}, + ) + return ( + 0, + False, + "", + {"message": "The resolution code or close notes do not match."}, + ) + + def teardown(self) -> None: + + # revert the state to initial_state + table_api_call( + instance=self.instance, + table="sn_customerservice_case", + method="POST", + data={ + "state": self.initial_state, + }, + params={ + "sysparm_query": f"number={self.config['case_number']}", + "sysparm_fields": "state", + "sysparm_limit": 1, + }, + ) + + +class GetCaseResolutionNotesTask(ServiceNowCaseTask): + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + close_notes = self.config["close_notes"] + + # check for close_notes + if close_notes.lower() in chat_messages[-1]["content"].lower(): + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully edited."}, + ) + return ( + 0, + False, + "", + {"message": "The close notes do not match."}, + ) + +class FindAssetUnderAccountCreateCaseTask(ServiceNowCaseTask): + + def __init__(self, seed: int, config: Dict[str, Any]) -> None: + super().__init__(seed, config) + self.record_sys_id = None + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + customer_account = self.config["customer_account"] + assets = [elem.strip() for elem in self.config.get("assets", "").split(",")] + + # find customer account sys id + result = table_api_call( + instance=self.instance, + table="customer_account", + params={ + "sysparm_query": f"nameSTARTSWITH{customer_account}", + # "sysparm_fields": "number", + "sysparm_limit": 1, + "sysparm_display_value": "true", + }, + )["result"] + + if not result: + return ( + 0, + False, + "", + {"message": "The customer account was not found."}, + ) + account_sys_id = result[0]["sys_id"] + + # Query sn_customerservice_case in ServiceNow + result = table_api_call( + instance=self.instance, + table="sn_customerservice_case", + params={ + "sysparm_query": f"account={account_sys_id}", + "sysparm_fields": "sys_id,short_description", + "sysparm_display_value": "true", + }, + )["result"] + + if not result: + return ( + 0, + False, + "", + {"message": "The case was not found."}, + ) + + self.record_sys_id = result[0]["sys_id"] + short_descriptions = [case["short_description"] for case in result] + + # check for assets + # TODO: this is not the best way to do it + for short_description in short_descriptions: + print(short_description) + if all(asset.lower() in short_description.lower() for asset in assets): + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully edited."}, + ) + return ( + 0, + False, + "", + {"message": "The assets do not match."}, + ) + + def teardown(self) -> None: + # TODO: is this robust enough? + if self.record_sys_id is not None: + db_delete_from_table( + instance=self.instance, + sys_id=self.record_sys_id, + table="sn_customerservice_case", + ) diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 5412a7e..848f327 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -9,6 +9,7 @@ class ServiceNowRoleTask(AbstractServiceNowTask): """ def __init__(self, seed: int, config: Dict[str, Any]) -> None: + super().__init__(seed) self.task_is_setup = False self.config = config self.timeout = 60000 @@ -27,9 +28,6 @@ def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Non def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: - # get instance info - instance_url = self.instance.snow_url - (snow_username, snow_password) = self.instance.snow_credentials # get relevant info from config user_full_name = self.config["user_full_name"] From f6d53061e079770d11832dc0f97ba648a593ca05 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 5 Dec 2025 22:46:20 +0000 Subject: [PATCH 03/56] minor formatting --- src/browsergym/workarena/tasks/case.py | 7 ++++--- src/browsergym/workarena/tasks/role.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/browsergym/workarena/tasks/case.py b/src/browsergym/workarena/tasks/case.py index f869747..80e4164 100644 --- a/src/browsergym/workarena/tasks/case.py +++ b/src/browsergym/workarena/tasks/case.py @@ -1,14 +1,15 @@ +from typing import Any, Dict, List, Tuple + import playwright.sync_api -from typing import Tuple, List, Dict, Any import requests -from .base import AbstractServiceNowTask from ..api.utils import ( + HTTPError, db_delete_from_table, table_api_call, table_column_info, - HTTPError, ) +from .base import AbstractServiceNowTask class ServiceNowCaseTask(AbstractServiceNowTask): diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 848f327..c767859 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -1,6 +1,6 @@ +from typing import Any, Dict, List, Tuple import playwright.sync_api -from typing import Tuple, List, Dict, Any import requests class ServiceNowRoleTask(AbstractServiceNowTask): @@ -72,5 +72,6 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> return 1 def teardown(self) -> None: - # TODO: implement this (delete role for users) - pass \ No newline at end of file + + # go over all roles in sys_user_has_role and remove them for the given users + \ No newline at end of file From 0ad112c49e68575d6101f76c8896869184d7d822 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Mon, 8 Dec 2025 17:33:54 +0000 Subject: [PATCH 04/56] add json and evaluators for dynamic guidance tasks --- src/browsergym/workarena/__init__.py | 8 +++++++ .../task_configs/assign-role-to-user.json | 17 ++++++++++++++ .../assign-roles-to-user-explicit.json | 17 ++++++++++++++ .../assign-roles-to-user-implicit.json | 20 ++++++++++++++++ .../data_files/task_configs/close-case.json | 23 +++++++++++++++++++ .../find-asset-under-account-create-case.json | 17 ++++++++++++++ .../task_configs/get-case-resnotes.json | 17 ++++++++++++++ .../task_configs/get-case-status.json | 20 ++++++++++++++++ src/browsergym/workarena/tasks/case.py | 7 ++++++ src/browsergym/workarena/tasks/role.py | 5 +++- .../workarena/tasks/service_catalog.py | 6 +++++ 11 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json create mode 100644 src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json create mode 100644 src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json create mode 100644 src/browsergym/workarena/data_files/task_configs/close-case.json create mode 100644 src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json create mode 100644 src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json create mode 100644 src/browsergym/workarena/data_files/task_configs/get-case-status.json diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 47aaf5e..139a2f6 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -24,6 +24,8 @@ from .tasks.list import __TASKS__ as LIST_TASKS from .tasks.navigation import __TASKS__ as NAVIGATION_TASKS from .tasks.service_catalog import __TASKS__ as SERVICE_CATALOG_TASKS +from .tasks.case import __TASKS__ as CASE_TASKS +from .tasks.role import __TASKS__ as ROLE_TASKS from .tasks.compositional.base import CompositionalTask ALL_WORKARENA_TASKS = [ @@ -45,6 +47,12 @@ and not issubclass(task, CompositionalBuildingBlockTask) ] +ALL_WORKARENA_DYNAMIC_GUIDANCE_TASKS = [ + *SERVICE_CATALOG_TASKS, + *CASE_TASKS, + *ROLE_TASKS, +] + # register the WorkArena benchmark for task in ALL_WORKARENA_TASKS: diff --git a/src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json b/src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json new file mode 100644 index 0000000..3d2a0fd --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json @@ -0,0 +1,17 @@ +[ + { + "user_full_name": "Allie Pumphrey", + "roles": "admin", + "goal": "Assign Allie Pumphrey the admin role" + }, + { + "user_full_name": "Bridget Bottella", + "roles": "admin", + "goal": "Assign Bridget Bottella the admin role" + }, + { + "user_full_name": "Roger Seid", + "roles": "admin", + "goal": "Assign Roger Seid the admin role" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json b/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json new file mode 100644 index 0000000..1db0612 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json @@ -0,0 +1,17 @@ +[ + { + "user_full_name": "Minh Leclare", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Minh Leclare the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Roman Simone", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Roman Simone the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Yvette Kokoska", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Yvette Kokoska the following roles: canvas_admin, canvas_user" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json b/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json new file mode 100644 index 0000000..766fb95 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json @@ -0,0 +1,20 @@ +[ + { + "user_full_name": "Lucien Iurato", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lucien Iurato all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Josephine Sotlar", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Josephine Sotlar all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kerry Evertt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kerry Evertt all of the \"sn_incident\" roles" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/close-case.json b/src/browsergym/workarena/data_files/task_configs/close-case.json new file mode 100644 index 0000000..57a8c23 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/close-case.json @@ -0,0 +1,23 @@ +[ + { + "case_number": "CS1000001", + "resolution": "solved by customer", + "resolution_code": 4, + "close_notes": "Noise issue resolved after customer reduced dryer load", + "goal": "Close CS1000001, marking it as solved by customer. In the resolution notes, put \"Noise issue resolved after customer reduced dryer load\"" + }, + { + "case_number": "CS0000503", + "resolution": "fixed by support / guidance provided", + "resolution_code": 1, + "close_notes": "Shipped a replacement FabriKare FX400 dryer to the customer", + "goal": "Close CS0000503, marking it as fixed by support / guidance provided. In the resolution notes, put \"Shipped a replacement FabriKare FX400 dryer to the customer\"" + }, + { + "case_number": "CS0000008", + "resolution": "inconclusive - cannot reproduce", + "resolution_code": 6, + "close_notes": "Unable to sound alarm for more than one minute", + "goal": "Close CS0000008, marking it as inconclusive - cannot reproduce. In the resolution notes, put \"Unable to sound alarm for more than one minute\"" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json b/src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json new file mode 100644 index 0000000..8f45a62 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json @@ -0,0 +1,17 @@ +[ + { + "customer_account": "Cambrian", + "assets": "234-6563 - ACME KNS-ULTRA1100, 489-23436226 - ACME DM", + "goal": "An employee from Cambrian emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" + }, + { + "customer_account": "Elegant Communications", + "assets": "653-5574-2346 - ACME DM, 568-2465 - ACME KX Series - KX5000, 347-5384 - ACME KNS-ULTRA2200", + "goal": "An employee from Elegant Communications emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" + }, + { + "customer_account": "Advanced Routing Components", + "assets": "231W-PS-RTF - Iris 5875, 390-99IH - APC 42U 3100 SP1 NetShelter Rack", + "goal": "An employee from Advanced Routing Components emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json b/src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json new file mode 100644 index 0000000..d67f08e --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json @@ -0,0 +1,17 @@ +[ + { + "case_number": "CS0000872", + "close_notes": "Closed automatically due to closure of child cases", + "goal": "Get the resolution notes for CS0000872" + }, + { + "case_number": "CS0002001", + "close_notes": "Related Change Request CHG0030001 fixed.", + "goal": "Get the resolution notes for CS0002001" + }, + { + "case_number": "CS0001004", + "close_notes": "The team has applied a fix to pick all type of reports and you should no longer face this issue going forward.", + "goal": "Get the resolution notes for CS0001004" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/get-case-status.json b/src/browsergym/workarena/data_files/task_configs/get-case-status.json new file mode 100644 index 0000000..874acee --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/get-case-status.json @@ -0,0 +1,20 @@ +[ + { + "consumer_name": "Sam Collins", + "issue": "a failed SmartCool software update", + "state": "New", + "goal": "Get the status of Sam Collins's case regarding a failed SmartCool software update" + }, + { + "consumer_name": "Gilly Parker", + "issue": "washer not starting", + "state": "New", + "goal": "Get the status of Gilly Parker's case regarding washer not starting" + }, + { + "consumer_name": "Heath Vazquez", + "issue": "a failed software update", + "state": "New", + "goal": "Get the status of Heath Vazquez's case regarding a failed software update" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/case.py b/src/browsergym/workarena/tasks/case.py index 80e4164..94a5b3e 100644 --- a/src/browsergym/workarena/tasks/case.py +++ b/src/browsergym/workarena/tasks/case.py @@ -220,3 +220,10 @@ def teardown(self) -> None: sys_id=self.record_sys_id, table="sn_customerservice_case", ) + +__TASKS__ = [ + GetCaseStatusTask, + CloseCaseTask, + GetCaseResolutionNotesTask, + FindAssetUnderAccountCreateCaseTask, +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index c767859..ecd0c93 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -74,4 +74,7 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> def teardown(self) -> None: # go over all roles in sys_user_has_role and remove them for the given users - \ No newline at end of file + pass + + +__TASKS__ = [ServiceNowRoleTask] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 879cfd7..a7921e8 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -662,3 +662,9 @@ def __init__(self, *args, **kwargs): for var in locals().values() if isinstance(var, type) and issubclass(var, OrderHardwareTask) and var is not OrderHardwareTask ] + +__DYNAMIC_GUIDANCE_TASKS__ = [ + OrderAppleWatchTask, + OrderDeveloperLaptopTask, + OrderIpadProTask, +] \ No newline at end of file From c9757c512d113d8f3dc421bdf09dc4789c739907 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Mon, 8 Dec 2025 17:38:56 +0000 Subject: [PATCH 05/56] update dynamic guidance tasks for servicenow --- src/browsergym/workarena/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 139a2f6..12ece5a 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -24,6 +24,7 @@ from .tasks.list import __TASKS__ as LIST_TASKS from .tasks.navigation import __TASKS__ as NAVIGATION_TASKS from .tasks.service_catalog import __TASKS__ as SERVICE_CATALOG_TASKS +from .tasks.service_catalog import __DYNAMIC_GUIDANCE_TASKS__ as SERVICE_CATALOG_DYNAMIC_GUIDANCE_TASKS from .tasks.case import __TASKS__ as CASE_TASKS from .tasks.role import __TASKS__ as ROLE_TASKS from .tasks.compositional.base import CompositionalTask @@ -48,7 +49,7 @@ ] ALL_WORKARENA_DYNAMIC_GUIDANCE_TASKS = [ - *SERVICE_CATALOG_TASKS, + *SERVICE_CATALOG_DYNAMIC_GUIDANCE_TASKS, *CASE_TASKS, *ROLE_TASKS, ] From cdbc3d281cc58460afabcbc053f9e0d954b1b2b6 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Mon, 8 Dec 2025 17:51:44 +0000 Subject: [PATCH 06/56] bug fix --- src/browsergym/workarena/__init__.py | 8 +++++++- src/browsergym/workarena/tasks/role.py | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 12ece5a..26fb91d 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -128,7 +128,7 @@ def get_all_tasks_agents(filter="l2", meta_seed=42, n_seed_l1=10, is_agent_curri raise Exception("Unsupported filter used.") if len(filter) == 1: level = filter[0] - if level not in ["l1", "l2", "l3"]: + if level not in ["l1", "l2", "l3", "dg"]: raise Exception("Unsupported category of tasks.") else: rng = np.random.RandomState(meta_seed) @@ -138,6 +138,12 @@ def get_all_tasks_agents(filter="l2", meta_seed=42, n_seed_l1=10, is_agent_curri all_task_tuples.append((task, int(seed))) return all_task_tuples + elif level == "dg": + for task in ATOMIC_TASKS: + for seed in rng.randint(0, 1000, n_seed_l1): + all_task_tuples.append((task, int(seed))) + + return all_task_tuples if len(filter) == 2: level, filter_category = filter[0], filter[1] diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index ecd0c93..673558e 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -2,6 +2,9 @@ import playwright.sync_api import requests +from .base import AbstractServiceNowTask + + class ServiceNowRoleTask(AbstractServiceNowTask): """ From a4ecb8ede0add6e93bf0c8d9e4568133547f847f Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Tue, 9 Dec 2025 03:01:21 +0000 Subject: [PATCH 07/56] rename data files, bug fixes --- src/browsergym/workarena/__init__.py | 9 ++- src/browsergym/workarena/config.py | 26 ++++++++ ...er.json => assign_role_to_user_admin.json} | 0 ...son => assign_roles_to_user_explicit.json} | 0 ...son => assign_roles_to_user_implicit.json} | 0 .../{close-case.json => close_case.json} | 0 ...find_asset_under_account_create_case.json} | 0 ...e-resnotes.json => get_case_resnotes.json} | 0 ...-case-status.json => get_case_status.json} | 0 src/browsergym/workarena/tasks/case.py | 63 +++++++++++++------ src/browsergym/workarena/tasks/role.py | 63 +++++++++++++++---- 11 files changed, 129 insertions(+), 32 deletions(-) rename src/browsergym/workarena/data_files/task_configs/{assign-role-to-user.json => assign_role_to_user_admin.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{assign-roles-to-user-explicit.json => assign_roles_to_user_explicit.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{assign-roles-to-user-implicit.json => assign_roles_to_user_implicit.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{close-case.json => close_case.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{find-asset-under-account-create-case.json => find_asset_under_account_create_case.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{get-case-resnotes.json => get_case_resnotes.json} (100%) rename src/browsergym/workarena/data_files/task_configs/{get-case-status.json => get_case_status.json} (100%) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 26fb91d..15ad470 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -62,6 +62,13 @@ task, ) +# register dynamic guidance tasks +for task in ALL_WORKARENA_DYNAMIC_GUIDANCE_TASKS: + register_task( + task.get_task_id(), + task, + ) + workarena_tasks_all = [task_class.get_task_id() for task_class in ALL_WORKARENA_TASKS] workarena_tasks_atomic = [task_class.get_task_id() for task_class in ATOMIC_TASKS] @@ -139,7 +146,7 @@ def get_all_tasks_agents(filter="l2", meta_seed=42, n_seed_l1=10, is_agent_curri return all_task_tuples elif level == "dg": - for task in ATOMIC_TASKS: + for task in ALL_WORKARENA_DYNAMIC_GUIDANCE_TASKS: for seed in rng.randint(0, 1000, n_seed_l1): all_task_tuples.append((task, int(seed))) diff --git a/src/browsergym/workarena/config.py b/src/browsergym/workarena/config.py index 8d5dd13..11c97c1 100644 --- a/src/browsergym/workarena/config.py +++ b/src/browsergym/workarena/config.py @@ -233,3 +233,29 @@ # Report date filter patch flag REPORT_PATCH_FLAG = "WORKARENA_DATE_FILTER_PATCH" REPORT_FILTER_PROPERTY = "workarena.report.filter.config" + + +# Case tasks +GET_CASE_STATUS_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/get_case_status.json") +) +GET_CASE_RESOLUTION_NOTES_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/get_case_resnotes.json") +) +CLOSE_CASE_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/close_case.json") +) +FIND_ASSET_UNDER_ACCOUNT_CREATE_CASE_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/find_asset_under_account_create_case.json") +) + +# Role tasks +ASSIGN_ROLE_TO_USER_ADMIN_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/assign_role_to_user_admin.json") +) +ASSIGN_ROLES_TO_USER_EXPLICIT_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/assign_roles_to_user_explicit.json") +) +ASSIGN_ROLES_TO_USER_IMPLICIT_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/assign_roles_to_user_implicit.json") +) \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json b/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/assign-role-to-user.json rename to src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json diff --git a/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-explicit.json rename to src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json diff --git a/src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/assign-roles-to-user-implicit.json rename to src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json diff --git a/src/browsergym/workarena/data_files/task_configs/close-case.json b/src/browsergym/workarena/data_files/task_configs/close_case.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/close-case.json rename to src/browsergym/workarena/data_files/task_configs/close_case.json diff --git a/src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json b/src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/find-asset-under-account-create-case.json rename to src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json diff --git a/src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json b/src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/get-case-resnotes.json rename to src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json diff --git a/src/browsergym/workarena/data_files/task_configs/get-case-status.json b/src/browsergym/workarena/data_files/task_configs/get_case_status.json similarity index 100% rename from src/browsergym/workarena/data_files/task_configs/get-case-status.json rename to src/browsergym/workarena/data_files/task_configs/get_case_status.json diff --git a/src/browsergym/workarena/tasks/case.py b/src/browsergym/workarena/tasks/case.py index 94a5b3e..b1b405d 100644 --- a/src/browsergym/workarena/tasks/case.py +++ b/src/browsergym/workarena/tasks/case.py @@ -1,3 +1,4 @@ +import json from typing import Any, Dict, List, Tuple import playwright.sync_api @@ -9,15 +10,21 @@ table_api_call, table_column_info, ) +from ..config import ( + CLOSE_CASE_CONFIG_PATH, + FIND_ASSET_UNDER_ACCOUNT_CREATE_CASE_CONFIG_PATH, + GET_CASE_RESOLUTION_NOTES_CONFIG_PATH, + GET_CASE_STATUS_CONFIG_PATH, +) from .base import AbstractServiceNowTask + class ServiceNowCaseTask(AbstractServiceNowTask): - - def __init__(self, seed: int, config: Dict[str, Any]) -> None: - super().__init__(seed) + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) self.task_is_setup = False - self.config = config + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) self.timeout = 60000 def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: @@ -25,12 +32,15 @@ def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: info = self.config return goal, info + def all_configs(self): + raise NotImplementedError + class GetCaseStatusTask(ServiceNowCaseTask): def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: state = self.config["state"] - if state.lower() in chat_messages[-1]["content"].lower(): + if state.lower() in chat_messages[-1]["message"].lower(): return ( 1, True, @@ -44,11 +54,14 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> {"message": "The state does not match."}, ) + def all_configs(self): + return json.load(open(GET_CASE_STATUS_CONFIG_PATH)) + class CloseCaseTask(ServiceNowCaseTask): - - def __init__(self, seed: int, config: Dict[str, Any]) -> None: - super().__init__(seed, config) + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) self.initial_state = table_api_call( instance=self.instance, @@ -61,12 +74,12 @@ def __init__(self, seed: int, config: Dict[str, Any]) -> None: )["result"][0]["state"] def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: - + # gather info from config case_number = self.config["case_number"] resolution_code = self.config["resolution_code"] close_notes = self.config["close_notes"] - + # Query sn_customerservice_case in ServiceNow record = table_api_call( instance=self.instance, @@ -103,7 +116,7 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> ) def teardown(self) -> None: - + # revert the state to initial_state table_api_call( instance=self.instance, @@ -119,14 +132,17 @@ def teardown(self) -> None: }, ) + def all_configs(self): + return json.load(open(CLOSE_CASE_CONFIG_PATH)) + class GetCaseResolutionNotesTask(ServiceNowCaseTask): - + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: close_notes = self.config["close_notes"] # check for close_notes - if close_notes.lower() in chat_messages[-1]["content"].lower(): + if close_notes.lower() in chat_messages[-1]["message"].lower(): return ( 1, True, @@ -138,17 +154,21 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> False, "", {"message": "The close notes do not match."}, - ) + ) + + def all_configs(self): + return json.load(open(GET_CASE_RESOLUTION_NOTES_CONFIG_PATH)) + class FindAssetUnderAccountCreateCaseTask(ServiceNowCaseTask): - - def __init__(self, seed: int, config: Dict[str, Any]) -> None: - super().__init__(seed, config) + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) self.record_sys_id = None def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: - customer_account = self.config["customer_account"] + customer_account = self.config["customer_account"] assets = [elem.strip() for elem in self.config.get("assets", "").split(",")] # find customer account sys id @@ -197,7 +217,6 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> # check for assets # TODO: this is not the best way to do it for short_description in short_descriptions: - print(short_description) if all(asset.lower() in short_description.lower() for asset in assets): return ( 1, @@ -221,9 +240,13 @@ def teardown(self) -> None: table="sn_customerservice_case", ) + def all_configs(self): + return json.load(open(FIND_ASSET_UNDER_ACCOUNT_CREATE_CASE_CONFIG_PATH)) + + __TASKS__ = [ GetCaseStatusTask, CloseCaseTask, GetCaseResolutionNotesTask, FindAssetUnderAccountCreateCaseTask, -] \ No newline at end of file +] diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 673558e..27a208f 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -1,9 +1,15 @@ +import json from typing import Any, Dict, List, Tuple import playwright.sync_api import requests -from .base import AbstractServiceNowTask +from ..config import ( + ASSIGN_ROLE_TO_USER_ADMIN_CONFIG_PATH, + ASSIGN_ROLES_TO_USER_EXPLICIT_CONFIG_PATH, + ASSIGN_ROLES_TO_USER_IMPLICIT_CONFIG_PATH, +) +from .base import AbstractServiceNowTask class ServiceNowRoleTask(AbstractServiceNowTask): @@ -11,14 +17,13 @@ class ServiceNowRoleTask(AbstractServiceNowTask): Generic task for role manipulation (create/edit) in a table using a Glide form. """ - def __init__(self, seed: int, config: Dict[str, Any]) -> None: - super().__init__(seed) + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) self.task_is_setup = False - self.config = config + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) self.timeout = 60000 def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: - """Setup the task configuration and produce the goal.""" goal = self.config["goal"] @@ -31,12 +36,15 @@ def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Non def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: - # get relevant info from config user_full_name = self.config["user_full_name"] user_roles = self.config.get("roles", "admin") user_roles = [role.strip() for role in user_roles.split(",")] + # get instance url and credentials + instance_url = self.instance.snow_url + snow_username, snow_password = self.instance.snow_credentials + # query instance to get user sys id response = requests.get( f"{instance_url}/api/now/table/sys_user", @@ -51,7 +59,12 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> response.raise_for_status() record = response.json().get("result", []) if not record: - return 0 + return ( + 0, + False, + "", + {"message": "The user was not found."}, + ) user_sys_id = record[0]["sys_id"] # query sys_user_has_role to find user roles @@ -71,13 +84,41 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> roles = [elem["role"]["display_value"] for elem in result] for role in user_roles: if not role in roles: - return 0 - return 1 + return ( + 0, + False, + "", + {"message": "The role does not match."}, + ) + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully edited."}, + ) def teardown(self) -> None: - + # go over all roles in sys_user_has_role and remove them for the given users pass + def all_configs(self): + raise NotImplementedError + + +class AssignRoleToUserAdminTask(ServiceNowRoleTask): + def all_configs(self): + return json.load(open(ASSIGN_ROLE_TO_USER_ADMIN_CONFIG_PATH)) + + +class AssignRolesToUserImplicitTask(ServiceNowRoleTask): + def all_configs(self): + return json.load(open(ASSIGN_ROLES_TO_USER_IMPLICIT_CONFIG_PATH)) + + +class AssignRolesToUserExplicitTask(ServiceNowRoleTask): + def all_configs(self): + return json.load(open(ASSIGN_ROLES_TO_USER_EXPLICIT_CONFIG_PATH)) + -__TASKS__ = [ServiceNowRoleTask] \ No newline at end of file +__TASKS__ = [AssignRoleToUserAdminTask, AssignRolesToUserImplicitTask, AssignRolesToUserExplicitTask] From 2d49fd4dba6c7baf317732f8bab9ebd663d3c67e Mon Sep 17 00:00:00 2001 From: Orlando Marquez Date: Tue, 9 Dec 2025 13:45:48 -0500 Subject: [PATCH 08/56] extend form tasks into workspace form tasks --- .../create_workspace_incident_task.json | 119 ++++ .../create_workspace_problem_task.json | 518 ++++++++++++++++++ .../workarena/tasks/form_workspace.py | 188 +++++++ 3 files changed, 825 insertions(+) create mode 100644 src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json create mode 100644 src/browsergym/workarena/data_files/task_configs/create_workspace_problem_task.json create mode 100644 src/browsergym/workarena/tasks/form_workspace.py diff --git a/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json new file mode 100644 index 0000000..7dd3121 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json @@ -0,0 +1,119 @@ +[ + { + "fields": { + "business_impact": "Business impact", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "description", + "impact", + "short_description", + "business_impact" + ], + "template_record": { + "caller_id": "Rick Berzle", + "category": "Hardware", + "description": "Hard drive has been making a loud grinding noise for the last two days.", + "impact": "2 - Medium", + "severity": "3 - Low", + "short_description": "Seem to have an issue with my hard drive...", + "urgency": "3 - Low", + "business_impact": "Something is wrong" + } + }, + { + "fields": { + "business_impact": "Business impact", + "assignment_group": "Assignment group", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "description", + "impact", + "short_description", + "business_impact" + ], + "template_record": { + "caller_id": "Fred Luddy", + "description": "The hotfix was installed on my PC and now some of my applications have stopped working. Can I roll back to the previous version?", + "impact": "1 - High", + "short_description": "Please remove the latest hotfix from my PC", + "business_impact": "We are working on it" + } + }, + { + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "description", + "impact", + "short_description", + "business_impact" + ], + "template_record": { + "caller_id": "Abel Tuter", + "description": "Forgot password and unable to log in. Can you reset or resend my password?", + "impact": "3 - Low", + "short_description": "Reset my password", + "business_impact": "trivial reset password" + } + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/create_workspace_problem_task.json b/src/browsergym/workarena/data_files/task_configs/create_workspace_problem_task.json new file mode 100644 index 0000000..4aad81e --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_workspace_problem_task.json @@ -0,0 +1,518 @@ +[ + { + "fields": { + "assignment_group": "Assignment group", + "business_service": "Service", + "category": "Category", + "cmdb_ci": "Configuration item", + "description": "Description", + "impact": "Impact", + "service_offering": "Service offering", + "short_description": "Problem statement", + "urgency": "Urgency" + }, + "task_fields": [ + "short_description", + "impact", + "category", + "description" + ], + "template_record": { + "active": "false", + "activity_due": "UNKNOWN", + "additional_assignee_list": "", + "approval": "Not Yet Requested", + "approval_history": "", + "approval_set": "", + "assigned_to": { + "display_value": "Problem Coordinator B", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/38cb3f173b331300ad3cc9bb34efc4d6" + }, + "assignment_group": "", + "business_duration": "", + "business_service": "", + "calendar_duration": "", + "category": "Hardware", + "cause_notes": null, + "close_notes": "This is a Service Catalog item request", + "closed_at": "", + "closed_by": "", + "cmdb_ci": "", + "comments": "", + "comments_and_work_notes": "", + "company": "", + "confirmed_at": "", + "confirmed_by": "", + "contact_type": "Phone", + "contract": "", + "correlation_display": "", + "correlation_id": "", + "delivery_plan": "", + "delivery_task": "", + "description": "bizonal wateringly nonsuccessful checkerberry abridgeable", + "due_date": "", + "duplicate_of": "", + "escalation": "Normal", + "expected_start": "", + "first_reported_by_task": { + "display_value": "INC0000020", + "link": "https://dev215901.service-now.com/api/now/table/task/46edaa6aa9fe198101b9d14ced16619f" + }, + "fix_at": "", + "fix_by": "", + "fix_communicated_at": "", + "fix_communicated_by": "", + "fix_notes": null, + "follow_up": "", + "group_list": "", + "impact": "3 - Low", + "knowledge": "false", + "known_error": "false", + "location": "", + "made_sla": "false", + "major_problem": "false", + "number": "PRB0000003", + "opened_at": "2022-11-16 16:07:08", + "opened_by": { + "display_value": "Don Goodliffe", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/9ee1b13dc6112271007f9d0efdb69cd0" + }, + "order": "", + "parent": "", + "priority": "5 - Planning", + "problem_state": "Closed", + "reassignment_count": "", + "related_incidents": "1", + "reopen_count": "0", + "reopened_at": "", + "reopened_by": "", + "resolution_code": "Canceled", + "resolved_at": "", + "resolved_by": "", + "review_outcome": "", + "rfc": "", + "route_reason": "", + "service_offering": "", + "short_description": "Request for a Blackberry", + "sla_due": "UNKNOWN", + "state": "Closed", + "subcategory": null, + "sys_class_name": "Problem", + "sys_created_by": "david.loo", + "sys_created_on": "2022-11-16 16:07:08", + "sys_domain": { + "display_value": "global", + "link": "https://dev215901.service-now.com/api/now/table/sys_user_group/global" + }, + "sys_domain_path": "/", + "sys_id": "46fb9e31a9fe198101492060c2a4f8cb", + "sys_mod_count": "4", + "sys_tags": "", + "sys_updated_by": "admin", + "sys_updated_on": "2023-07-27 02:54:38", + "task_effective_number": "PRB0000003", + "time_worked": "", + "universal_request": "", + "upon_approval": null, + "upon_reject": null, + "urgency": "3 - Low", + "user_input": "", + "watch_list": "", + "work_end": "", + "work_notes": "", + "work_notes_list": "", + "work_start": "", + "workaround": null, + "workaround_applied": "false", + "workaround_communicated_at": "", + "workaround_communicated_by": "" + } + }, + { + "fields": { + "assignment_group": "Assignment group", + "business_service": "Service", + "category": "Category", + "cmdb_ci": "Configuration item", + "description": "Description", + "impact": "Impact", + "service_offering": "Service offering", + "short_description": "Problem statement", + "urgency": "Urgency" + }, + "task_fields": [ + "short_description", + "impact", + "category", + "description" + ], + "template_record": { + "active": "true", + "activity_due": "UNKNOWN", + "additional_assignee_list": "", + "approval": null, + "approval_history": "", + "approval_set": "", + "assigned_to": { + "display_value": "Problem Coordinator B", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/38cb3f173b331300ad3cc9bb34efc4d6" + }, + "assignment_group": "", + "business_duration": "", + "business_service": "", + "calendar_duration": "", + "category": "Network", + "cause_notes": null, + "close_notes": "", + "closed_at": "", + "closed_by": "", + "cmdb_ci": "", + "comments": "", + "comments_and_work_notes": "", + "company": "", + "confirmed_at": "2021-11-19 15:48:36", + "confirmed_by": { + "display_value": "Problem Coordinator B", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/38cb3f173b331300ad3cc9bb34efc4d6" + }, + "contact_type": null, + "contract": "", + "correlation_display": "", + "correlation_id": "", + "delivery_plan": "", + "delivery_task": "", + "description": "The 1st floor router is down again. Nobody down there can get at anything outside their own subnet.", + "due_date": "", + "duplicate_of": "", + "escalation": "High", + "expected_start": "", + "first_reported_by_task": { + "display_value": "INC0000001", + "link": "https://dev215901.service-now.com/api/now/table/task/9c573169c611228700193229fff72400" + }, + "fix_at": "", + "fix_by": "", + "fix_communicated_at": "", + "fix_communicated_by": "", + "fix_notes": null, + "follow_up": "", + "group_list": "", + "impact": "3 - Low", + "knowledge": "false", + "known_error": "false", + "location": "", + "made_sla": "false", + "major_problem": "false", + "number": "PRB0000007", + "opened_at": "2021-06-04 15:32:07", + "opened_by": { + "display_value": "Don Goodliffe", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/9ee1b13dc6112271007f9d0efdb69cd0" + }, + "order": "", + "parent": "", + "priority": "5 - Planning", + "problem_state": "Assess", + "reassignment_count": "", + "related_incidents": "2", + "reopen_count": "0", + "reopened_at": "", + "reopened_by": "", + "resolution_code": null, + "resolved_at": "", + "resolved_by": "", + "review_outcome": "", + "rfc": "", + "route_reason": "", + "service_offering": "", + "short_description": "Router Down", + "sla_due": "UNKNOWN", + "state": "Assess", + "subcategory": null, + "sys_class_name": "Problem", + "sys_created_by": "pat", + "sys_created_on": "2021-06-04 15:32:07", + "sys_domain": { + "display_value": "global", + "link": "https://dev215901.service-now.com/api/now/table/sys_user_group/global" + }, + "sys_domain_path": "/", + "sys_id": "9d3a266ac6112287004e37fb2ceb0133", + "sys_mod_count": "34", + "sys_tags": "", + "sys_updated_by": "admin", + "sys_updated_on": "2024-03-11 11:39:12", + "task_effective_number": "PRB0000007", + "time_worked": "", + "universal_request": "", + "upon_approval": null, + "upon_reject": null, + "urgency": "3 - Low", + "user_input": "", + "watch_list": "", + "work_end": "", + "work_notes": "", + "work_notes_list": "", + "work_start": "", + "workaround": null, + "workaround_applied": "false", + "workaround_communicated_at": "", + "workaround_communicated_by": "" + } + }, + { + "fields": { + "assignment_group": "Assignment group", + "business_service": "Service", + "category": "Category", + "cmdb_ci": "Configuration item", + "description": "Description", + "impact": "Impact", + "service_offering": "Service offering", + "short_description": "Problem statement", + "urgency": "Urgency" + }, + "task_fields": [ + "short_description", + "impact", + "category", + "description" + ], + "template_record": { + "active": "true", + "activity_due": "UNKNOWN", + "additional_assignee_list": "", + "approval": "Not Yet Requested", + "approval_history": "", + "approval_set": "", + "assigned_to": { + "display_value": "Problem Coordinator A", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/73ab3f173b331300ad3cc9bb34efc4df" + }, + "assignment_group": "", + "business_duration": "", + "business_service": "", + "calendar_duration": "", + "category": "Software", + "cause_notes": null, + "close_notes": "", + "closed_at": "", + "closed_by": "", + "cmdb_ci": "Email", + "comments": "", + "comments_and_work_notes": "", + "company": "", + "confirmed_at": "", + "confirmed_by": "", + "contact_type": null, + "contract": "", + "correlation_display": "", + "correlation_id": "", + "delivery_plan": "", + "delivery_task": "", + "description": "Unable to send or receive emails.Looks like issue is with the email server.", + "due_date": "", + "duplicate_of": "", + "escalation": "Normal", + "expected_start": "", + "first_reported_by_task": "", + "fix_at": "", + "fix_by": "", + "fix_communicated_at": "", + "fix_communicated_by": "", + "fix_notes": null, + "follow_up": "", + "group_list": "", + "impact": "3 - Low", + "knowledge": "false", + "known_error": "false", + "location": "", + "made_sla": "true", + "major_problem": "false", + "number": "PRB0007601", + "opened_at": "2018-08-30 01:08:39", + "opened_by": { + "display_value": "System Administrator", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/6816f79cc0a8016401c5a33be04be441" + }, + "order": "", + "parent": "", + "priority": "5 - Planning", + "problem_state": "New", + "reassignment_count": "0", + "related_incidents": "0", + "reopen_count": "0", + "reopened_at": "", + "reopened_by": "", + "resolution_code": null, + "resolved_at": "", + "resolved_by": "", + "review_outcome": "", + "rfc": "", + "route_reason": "", + "service_offering": "", + "short_description": "Unable to send or receive emails.", + "sla_due": "UNKNOWN", + "state": "New", + "subcategory": "Email", + "sys_class_name": "Problem", + "sys_created_by": "admin", + "sys_created_on": "2018-08-30 01:09:05", + "sys_domain": { + "display_value": "global", + "link": "https://dev215901.service-now.com/api/now/table/sys_user_group/global" + }, + "sys_domain_path": "/", + "sys_id": "62304320731823002728660c4cf6a7e8", + "sys_mod_count": "1", + "sys_tags": "", + "sys_updated_by": "admin", + "sys_updated_on": "2018-12-11 23:16:57", + "task_effective_number": "PRB0007601", + "time_worked": "", + "universal_request": "", + "upon_approval": "Proceed to Next Task", + "upon_reject": "Cancel all future Tasks", + "urgency": "3 - Low", + "user_input": "", + "watch_list": "", + "work_end": "", + "work_notes": "", + "work_notes_list": "", + "work_start": "", + "workaround": null, + "workaround_applied": "false", + "workaround_communicated_at": "", + "workaround_communicated_by": "" + } + }, + { + "fields": { + "assignment_group": "Assignment group", + "business_service": "Service", + "category": "Category", + "cmdb_ci": "Configuration item", + "description": "Description", + "impact": "Impact", + "service_offering": "Service offering", + "short_description": "Problem statement", + "urgency": "Urgency" + }, + "task_fields": [ + "short_description", + "impact", + "category", + "description" + ], + "template_record": { + "active": "true", + "activity_due": "UNKNOWN", + "additional_assignee_list": "", + "approval": "Not Yet Requested", + "approval_history": "", + "approval_set": "", + "assigned_to": { + "display_value": "Problem Coordinator A", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/73ab3f173b331300ad3cc9bb34efc4df" + }, + "assignment_group": "Problem Solving", + "business_duration": "", + "business_service": "", + "calendar_duration": "", + "category": "Hardware", + "cause_notes": null, + "close_notes": "", + "closed_at": "", + "closed_by": "", + "cmdb_ci": "Dell Wireless WLAN Utility", + "comments": "", + "comments_and_work_notes": "", + "company": "", + "confirmed_at": "2023-09-12 10:04:43", + "confirmed_by": { + "display_value": "Problem Coordinator A", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/73ab3f173b331300ad3cc9bb34efc4df" + }, + "contact_type": null, + "contract": "", + "correlation_display": "", + "correlation_id": "", + "delivery_plan": "", + "delivery_task": "", + "description": "Using a Dell Wireless WLAN Utility I cannot enable the option to disable wireless when plugin into an Ethernet port", + "due_date": "", + "duplicate_of": "", + "escalation": "Normal", + "expected_start": "", + "first_reported_by_task": "", + "fix_at": "", + "fix_by": "", + "fix_communicated_at": "", + "fix_communicated_by": "", + "fix_notes": null, + "follow_up": "", + "group_list": "", + "impact": "2 - Medium", + "knowledge": "false", + "known_error": "true", + "location": "", + "made_sla": "true", + "major_problem": "false", + "number": "PRB0000012", + "opened_at": "2023-09-12 10:04:43", + "opened_by": { + "display_value": "Don Goodliffe", + "link": "https://dev215901.service-now.com/api/now/table/sys_user/9ee1b13dc6112271007f9d0efdb69cd0" + }, + "order": "", + "parent": "", + "priority": "4 - Low", + "problem_state": "Assess", + "reassignment_count": "1", + "related_incidents": "", + "reopen_count": "0", + "reopened_at": "", + "reopened_by": "", + "resolution_code": null, + "resolved_at": "", + "resolved_by": "", + "review_outcome": "", + "rfc": "", + "route_reason": "", + "service_offering": "", + "short_description": "Cannot disable wireless when plug into an Ethernet port", + "sla_due": "UNKNOWN", + "state": "Assess", + "subcategory": null, + "sys_class_name": "Problem", + "sys_created_by": "admin", + "sys_created_on": "2023-09-12 10:12:12", + "sys_domain": { + "display_value": "global", + "link": "https://dev215901.service-now.com/api/now/table/sys_user_group/global" + }, + "sys_domain_path": "/", + "sys_id": "e9b0e55567b032004792adab9485ef6c", + "sys_mod_count": "3", + "sys_tags": "", + "sys_updated_by": "admin", + "sys_updated_on": "2023-07-27 23:14:22", + "task_effective_number": "PRB0000012", + "time_worked": "", + "universal_request": "", + "upon_approval": "Proceed to Next Task", + "upon_reject": "Cancel all future Tasks", + "urgency": "3 - Low", + "user_input": "", + "watch_list": "", + "work_end": "", + "work_notes": "", + "work_notes_list": "", + "work_start": "", + "workaround": null, + "workaround_applied": "false", + "workaround_communicated_at": "", + "workaround_communicated_by": "" + } + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py new file mode 100644 index 0000000..9da49da --- /dev/null +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -0,0 +1,188 @@ +from .form import CreateIncidentTask, CreateProblemTask +from playwright.sync_api import Page +from .utils.utils import prettyprint_enum +from .form import GenericNewRecordTask +from importlib import resources +from ..config import data_files +import logging +from typing import Tuple +from ..api.utils import table_api_call + + +class GenericCreateWorkspaceTask(GenericNewRecordTask): + + def setup_goal(self, page: Page) -> tuple[str, dict]: + super().setup_goal(page=page) + + # Get the task configuration + assert self.all_configs is not None, "No configuration available for the task." + config = self.fixed_config if self.fixed_config else self.random.choice(self.all_configs) + self.config = config + # If fixed_config is not None we already set the required attributes in the constructor + if self.fixed_config is None: + self._set_required_config_attributes(config) + self.protected_fields = self.task_fields + # Generate the goal + goal = ( + f"In the Service Operations workspace, create a new {self.table_label} with " + + prettyprint_enum( + [ + f'a value of "{self.template_record[f]}"' + + f' for field "{self.config["fields"][f]}"' + for f in self.task_fields + ] + ) + + "." + ) + info = {} + + return goal, info + + def validate( + self, page: Page, chat_messages: list[str] + ) -> Tuple[float, bool, str, dict]: + # get the url of the current page + if f"sow/record/{self.table_name}/" not in page.url: + return 0.0, False, "", {"message": f"The assistant is not in the workspace {self.table_label} form."} + else: + # Get the string after sow/record// in the url but before the /params + # This may not be a valid sys id, which does not matter as no record will be found with it + sys_id = page.url.split(f"sow/record/{self.table_name}/")[1].split("/params")[0] + + # Check that a record has actually been created + if sys_id is None: + logging.info("No record has been created or the form has not been submitted.") + return ( + 0, + False, + "", + {"message": "No record has been created or the form has not been submitted."}, + ) + + print(f"Found sys_id {sys_id} in the URL") + + # Add the sysid to the list of created sysids + # This is used to clean up the database after the task is completed. + self.created_sysids.append(sys_id) + + # Pull the record from the database + # XXX: It's possible that the record is not found, e.g., if form submission was rejected due to client-side + # validation errors. In this case, we should not raise an error and simply consider that no record was + # created. This is non-terminal for the task. + record = table_api_call( + instance=self.instance, + table=self.table_name, + params={ + "sysparm_query": f"sys_id={sys_id}", + "sysparm_display_value": True, + }, + wait_for_record=True, + max_retries=20, # Wait up to 10 seconds + raise_on_wait_expired=False, + )["result"] + + # This can happen if the form was submitted but was rejected due to invalid inputs (e.g., missing mandatory fields) + if len(record) == 0: + logging.info( + "The record was not found in the database. Perhaps the form was not submitted correctly. " + + sys_id, + ) + return ( + 0, + False, + "", + { + "message": "The record was not found in the database. Perhaps the form was not submitted correctly." + }, + ) + + # Extract display values for reference fields + record = { + f: v if not isinstance(v, dict) else v["display_value"] for f, v in record[0].items() + } + + # Check that the record matches the expected values + for f in self.task_fields: + if record[f].strip() != self.template_record[f].strip(): + error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{record[f].strip()}".' + logging.info(error_msg) + return ( + 0, + True, + error_msg, + {"message": error_msg}, + ) + + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully created."}, + ) + + def _wait_for_ready(self, page: Page, iframe_only=False) -> None: + """ + Waits for the main iframe and APIs to be fully loaded + + Parameters: + ---------- + page: playwright.sync_api.Page + The page on which to wait for the iframe to be loaded + iframe_only: bool + If True, only wait for the iframe to be loaded. If False, also wait for the APIs to be available. + + """ + logging.debug(f"Waiting for {self.js_prefix} to be fully loaded") + try: + page.wait_for_function( + f"typeof window.{self.js_prefix} !== 'undefined' && window.{self.js_prefix}.WORKARENA_LOAD_COMPLETE", + ) + except: + page.wait_for_load_state("networkidle") + return + logging.debug(f"Detected {self.js_prefix} ready") + + +class CreateWorkspaceIncidentTask(CreateIncidentTask, GenericCreateWorkspaceTask): + config_path = str( + resources.files(data_files).joinpath("task_configs/create_workspace_incident_task.json") + ) + + def __init__(self, seed: int = None, + instance=None, + fixed_config: dict = None, + check_record_created=True, + **kwargs) -> None: + + super().__init__( + seed=seed, + instance=instance, + fixed_config=fixed_config, + check_record_created=check_record_created) + + # Force starting at the homepage + self.start_url = self.instance.snow_url + + +class CreateWorkspaceProblemTask(CreateProblemTask, GenericCreateWorkspaceTask): + config_path = str( + resources.files(data_files).joinpath("task_configs/create_workspace_problem_task.json") + ) + + def __init__(self, seed: int = None, + instance=None, + fixed_config: dict = None, + check_record_created=True, + **kwargs) -> None: + + super().__init__( + seed=seed, + instance=instance, + fixed_config=fixed_config, + check_record_created=check_record_created) + + # Force starting at the homepage + self.start_url = self.instance.snow_url + + +__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask] \ No newline at end of file From 9e45699704f782783291b4e07ba6d2ee2f813da0 Mon Sep 17 00:00:00 2001 From: Orlando Marquez Date: Wed, 10 Dec 2025 14:23:51 -0500 Subject: [PATCH 09/56] add incident tasks with custom goal --- .../create_workspace_incident_task.json | 255 ++++++++++++++++++ .../workarena/tasks/form_workspace.py | 23 +- 2 files changed, 269 insertions(+), 9 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json index 7dd3121..d895835 100644 --- a/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json +++ b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json @@ -115,5 +115,260 @@ "short_description": "Reset my password", "business_impact": "trivial reset password" } + }, + { + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "urgency", + "category", + "short_description", + "parent_incident" + ], + "template_record": { + "caller_id": "Owen Sparacino", + "urgency": "3 - Low", + "category": "Inquiry / Help", + "short_description": "he can't locate the Weather Bug icon on his desktop", + "parent_incident": "INC0000029" + } + }, + { + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "urgency", + "category", + "short_description", + "parent_incident" + ], + "template_record": { + "caller_id": "Genevieve Kekiwi", + "urgency": "2 - Medium", + "category": "Inquiry / Help", + "short_description": "she is unable to send and receive emails", + "parent_incident": "INC0000049" + } + }, + { + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "urgency", + "category", + "short_description", + "parent_incident" + ], + "template_record": { + "caller_id": "Margot Arenburg", + "urgency": "1 - High", + "category": "Inquiry / Help", + "short_description": "she can't connect to Exchange", + "parent_incident": "INC0000037" + } + }, + { + "goal": "In the Service Operations workspace, create an incident for a {category} issue called in by {caller_id}: {short_description}. Set impact and urgency as {impact} and add {watch_list} to the watchlist", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "watch_list": "Watch list", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "category", + "impact", + "urgency", + "short_description", + "watch_list" + ], + "template_record": { + "caller_id": "Evan Pyfrom", + "category": "Hardware", + "impact": "3 - Low", + "urgency": "3 - Low", + "short_description": "His mouse is stuttering", + "watch_list": "Sharlene Circelli" + } + }, + { + "goal": "In the Service Operations workspace, create an incident for a {category} issue called in by {caller_id}: {short_description}. Set impact and urgency as {impact} and add {watch_list} to the watchlist", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "watch_list": "Watch list", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "category", + "impact", + "urgency", + "short_description", + "watch_list" + ], + "template_record": { + "caller_id": "Kennith Peto", + "category": "Network", + "impact": "2 - Medium", + "urgency": "2 - Medium", + "short_description": "The system is not accepting his new password", + "watch_list": "Nathanial Phoenix" + } + }, + { + "goal": "In the Service Operations workspace, create an incident for a {category} issue called in by {caller_id}: {short_description}. Set impact and urgency as {impact} and add {watch_list} to the watchlist", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "watch_list": "Watch list", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "category", + "impact", + "urgency", + "short_description", + "watch_list" + ], + "template_record": { + "caller_id": "Mara Rineheart", + "category": "Software", + "impact": "1 - High", + "urgency": "1 - High", + "short_description": "All employee laptops in the New York office have been infected with malware", + "watch_list": "Dude Lewbowskie" + } } ] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index 9da49da..105b783 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -22,18 +22,23 @@ def setup_goal(self, page: Page) -> tuple[str, dict]: if self.fixed_config is None: self._set_required_config_attributes(config) self.protected_fields = self.task_fields - # Generate the goal - goal = ( - f"In the Service Operations workspace, create a new {self.table_label} with " - + prettyprint_enum( - [ - f'a value of "{self.template_record[f]}"' + + if "goal" in self.config: + goal = self.config["goal"] + # replace placeholders + goal = goal.format(**self.template_record) + else: + goal = ( + f"In the Service Operations workspace, create a new {self.table_label} with " + + prettyprint_enum( + [ + f'a value of "{self.template_record[f]}"' + f' for field "{self.config["fields"][f]}"' for f in self.task_fields ] ) - + "." - ) + + "." + ) info = {} return goal, info @@ -108,7 +113,7 @@ def validate( logging.info(error_msg) return ( 0, - True, + False, # False because we should let the agent continue trying error_msg, {"message": error_msg}, ) From 1036218f2e12121f690ea7b4809d4ff74f55ebef Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 14:31:01 +0000 Subject: [PATCH 10/56] update tasks for ritm, interaction --- src/browsergym/workarena/tasks/interaction.py | 93 +++++++ src/browsergym/workarena/tasks/ritm.py | 234 ++++++++++++++++++ src/browsergym/workarena/tasks/role.py | 25 +- 3 files changed, 344 insertions(+), 8 deletions(-) create mode 100644 src/browsergym/workarena/tasks/interaction.py create mode 100644 src/browsergym/workarena/tasks/ritm.py diff --git a/src/browsergym/workarena/tasks/interaction.py b/src/browsergym/workarena/tasks/interaction.py new file mode 100644 index 0000000..2cbafbe --- /dev/null +++ b/src/browsergym/workarena/tasks/interaction.py @@ -0,0 +1,93 @@ +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, db_delete_from_table +from ..config import ( + CREATE_INTERACTION_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowInteractionTask(AbstractServiceNowTask): + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + +class CreateInteractionTask(ServiceNowInteractionTask): + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # get customer problem from config + customer_problem = self.config["customer_problem"] + + # Query interaction table using LIKE operator + # TODO: difficult to verify and test + # no way of guaranteeing correct retrieval based on short description + # no existing interactions on the platform we can use to test function + response = requests.get( + f"{self.instance.snow_url}/api/now/table/interaction", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"short_descriptionLIKE{customer_problem}", + "sysparm_fields": "sys_id,short_description", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if result: + # Interaction exists with matching short description + # get sys_id from result + sys_id = result[0]["sys_id"] + self.created_sysids.append(sys_id) + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The interaction was successfully created."}, + ) + + return ( + 0, + False, + "", + {"message": "The interaction was not found."}, + ) + + + def teardown(self) -> None: + # go over all created sysids and delete that record in the interaction table + for sys_id in self.created_sysids: + if sys_id is not None: + try: + db_delete_from_table(instance=self.instance, sys_id=sys_id, table="interaction") + except HTTPError: + # sys_id was stored in local storage (for submitted) + # but the record is absent from the database (probably invalid form) + pass + + def all_configs(self): + return json.load(open(CREATE_INTERACTION_CONFIG_PATH)) + \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/ritm.py b/src/browsergym/workarena/tasks/ritm.py new file mode 100644 index 0000000..a05c5f6 --- /dev/null +++ b/src/browsergym/workarena/tasks/ritm.py @@ -0,0 +1,234 @@ +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, table_api_call +from ..config import ( + CHANGE_RITM_STATUS_CONFIG_PATH, + UPDATE_RITM_QUANTITY_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowRitmTask(AbstractServiceNowTask): + """ + Generic task for ritm manipulation (create/edit) in a table using a Glide form. + """ + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + pass + + def teardown(self) -> None: + pass + + +class ChangeRitmStatusTask(ServiceNowRitmTask): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + # get initial state of ritm + self.initial_approval = self._get_initial_state() + + def all_configs(self): + return json.load(open(CHANGE_RITM_STATUS_CONFIG_PATH)) + + def _get_initial_state(self): + ritm_number = self.config["ritm_number"] + + # get instance url and credentials + instance_url = self.instance.snow_url + snow_username, snow_password = self.instance.snow_credentials + + # Query sc_req_item to check the RITM status + response = requests.get( + f"{instance_url}/api/now/table/sc_req_item", + auth=(snow_username, snow_password), + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={ritm_number}", + "sysparm_fields": "sys_id,number,approval", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"RITM {ritm_number} not found") + return result[0]["approval"] + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # get relevant info from config + ritm_number = self.config["ritm_number"] + approval = self.config["approval"] + + # get instance url and credentials + instance_url = self.instance.snow_url + snow_username, snow_password = self.instance.snow_credentials + + # Query sc_req_item to check the RITM status + response = requests.get( + f"{instance_url}/api/now/table/sc_req_item", + auth=(snow_username, snow_password), + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={ritm_number}^approval={approval}", + "sysparm_fields": "sys_id,number,approval", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if result: + # Found a matching RITM with the correct status + + # TODO: revert state of RITM + + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The requested item status was successfully updated."}, + ) + + return ( + 0, + False, + "", + {"message": "The requested item status was not updated."}, + ) + + def teardown(self) -> None: + # revert to previous state + if self.initial_approval and self.initial_approval != self.config["approval"]: + try: + table_api_call( + instance=self.instance, + table="sc_req_item", + params={ + "sysparm_query": f"number={self.config['ritm_number']}", + "sysparm_fields": "sys_id,number,approval", + "sysparm_limit": 1, + }, + data={ + "approval": self.initial_approval, + }, + method="PUT", + ) + except HTTPError: + # sys_id was stored in local storage (for submitted) + # but the record is absent from the database (probably invalid form) + pass + + +class UpdateRitmQuantityTask(ServiceNowRitmTask): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + # get initial quantity + self.initial_quantity = self._get_initial_quantity() + + def all_configs(self): + return json.load(open(UPDATE_RITM_QUANTITY_CONFIG_PATH)) + + def _get_initial_quantity(self): + ritm_number = self.config["ritm_number"] + + # Query sc_req_item to check the RITM status + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sc_req_item", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={ritm_number}", + "sysparm_fields": "sys_id,number,quantity", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"RITM {ritm_number} not found") + return result[0]["quantity"] + + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # get relevant info from config + ritm_number = self.config["ritm_number"] + quantity = self.config["quantity"] + + # Query sn_customerservice_case in ServiceNow + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sc_req_item", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={ritm_number}", + "sysparm_fields": "sys_id,number,quantity", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + + # check for quantity + if result and int(result[0]["quantity"]) == int(quantity): + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The ritm quantity was successfully updated."}, + ) + + return ( + 0, + False, + "", + {"message": "The ritm quantity was not updated."}, + ) + + + def teardown(self) -> None: + if self.initial_quantity and self.initial_quantity != self.config["quantity"]: + try: + table_api_call( + instance=self.instance, + table="sc_req_item", + params={ + "sysparm_query": f"number={self.config['ritm_number']}", + "sysparm_fields": "sys_id,number,quantity", + "sysparm_limit": 1, + }, + data={ + "quantity": self.initial_quantity, + }, + method="PUT", + ) + except HTTPError: + # sys_id was stored in local storage (for submitted) + # but the record is absent from the database (probably invalid form) + pass \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 27a208f..18301b3 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -4,6 +4,7 @@ import playwright.sync_api import requests +from ..api.utils import HTTPError, db_delete_from_table from ..config import ( ASSIGN_ROLE_TO_USER_ADMIN_CONFIG_PATH, ASSIGN_ROLES_TO_USER_EXPLICIT_CONFIG_PATH, @@ -22,6 +23,7 @@ def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url self.task_is_setup = False self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) self.timeout = 60000 + self.created_sysids = [] def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: """Setup the task configuration and produce the goal.""" @@ -41,14 +43,10 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> user_roles = self.config.get("roles", "admin") user_roles = [role.strip() for role in user_roles.split(",")] - # get instance url and credentials - instance_url = self.instance.snow_url - snow_username, snow_password = self.instance.snow_credentials - # query instance to get user sys id response = requests.get( - f"{instance_url}/api/now/table/sys_user", - auth=(snow_username, snow_password), + f"{self.instance.snow_url}/api/now/table/sys_user", + auth=self.instance.snow_credentials, headers={"Accept": "application/json"}, params={ "sysparm_query": f"name={user_full_name}", @@ -90,6 +88,10 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> "", {"message": "The role does not match."}, ) + else: + # find which row from result is associated with that role, get sys_id, and save + sys_id = next((elem["sys_id"] for elem in result if elem["role"]["display_value"] == role), None) + self.created_sysids.append(sys_id) return ( 1, True, @@ -99,8 +101,15 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> def teardown(self) -> None: - # go over all roles in sys_user_has_role and remove them for the given users - pass + # go over all created sysids and delete that record in the sys_user_has_role table + for sys_id in self.created_sysids: + if sys_id is not None: + try: + db_delete_from_table(instance=self.instance, sys_id=sys_id, table="sys_user_has_role") + except HTTPError: + # sys_id was stored in local storage (for submitted) + # but the record is absent from the database (probably invalid form) + pass def all_configs(self): raise NotImplementedError From 27e68285535bb9517f693be7d4cc5cb258231c6e Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 15:26:30 +0000 Subject: [PATCH 11/56] add validators and teardown for three incident related tasks --- src/browsergym/workarena/tasks/incident.py | 372 +++++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 src/browsergym/workarena/tasks/incident.py diff --git a/src/browsergym/workarena/tasks/incident.py b/src/browsergym/workarena/tasks/incident.py new file mode 100644 index 0000000..5ffeaf9 --- /dev/null +++ b/src/browsergym/workarena/tasks/incident.py @@ -0,0 +1,372 @@ +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, db_delete_from_table, table_api_call +from ..config import ( + CREATE_INTERACTION_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowIncidentTask(AbstractServiceNowTask): + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + +class CreateIncidentTask(ServiceNowIncidentTask): + pass + +class CreateChildIncidentTask(ServiceNowIncidentTask): + pass + +class CreateIncidentWithWatchlistTask(ServiceNowIncidentTask): + pass + + +class AddAdditionalAssigneeToIncidentTask(ServiceNowIncidentTask): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.initial_incident_additional_assignee_list = self._get_initial_incident_additional_assignee_list() + + def _get_initial_incident_additional_assignee_list(self): + incident_number = self.config["incident_number"] + + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,additional_assignee_list", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"Incident {incident_number} not found") + + return result[0]["additional_assignee_list"] + + def all_configs(self): + return json.load(open(ADD_ADDITIONAL_ASSIGNEE_TO_INCIDENT_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + incident_number = self.config["incident_number"] + additional_assignee_list = self.config["additional_assignee_list"] + + # Query incident table in ServiceNow + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,number,additional_assignee_list", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + + # check for additional_assignee_list + if result and result[0]["additional_assignee_list"] == additional_assignee_list: + # TODO: validate whether the verification is OK + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The additional assignee was added to the incident."}, + ) + return ( + 0, + False, + "", + {"message": "The additional assignee was not added to the incident."}, + ) + + def teardown(self): + # revert the additional_assignee_list to the initial value + if self.initial_incident_additional_assignee_list is not None and self.config["additional_assignee_list"] != self.initial_incident_additional_assignee_list: + try: + table_api_call( + instance=self.instance, + table="incident", + params={ + "sysparm_query": f"number={self.config['incident_number']}", + }, + data={ + "additional_assignee_list": self.initial_incident_additional_assignee_list, + }, + method="PUT", + ) + except HTTPError: + pass + + + +class UpdateIncidentTask(ServiceNowIncidentTask): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.initial_incident_urgency = self._get_initial_incident_urgency() + self.comment_sys_id = None + + def _get_initial_incident_urgency(self): + incident_number = self.config["incident_number"] + + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,urgency", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"Incident {incident_number} not found") + + return result[0]["urgency"] + + def all_configs(self): + return json.load(open(UPDATE_INCIDENT_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + incident_number = self.config["incident_number"] + comment = self.config["comment"] + updated_urgency = self.config["updated_urgency"] + + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,urgency", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + + result = response.json().get("result", []) + if not result: + return ( + 0, + False, + "", + {"message": "The incident was not found."}, + ) + + if int(result[0]["urgency"]) != int(updated_urgency): + return ( + 0, + False, + "", + {"message": "The urgency was not updated."}, + ) + + incident_sys_id = result[0]["sys_id"] + + # search for comments in sys_journal_field + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sys_journal_field", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"element_id={incident_sys_id}", + "sysparm_fields": "sys_id,value", + "sysparm_limit": 100, + }, + ) + response.raise_for_status() + + result = response.json().get("result", []) + if not result: + return ( + 0, + False, + "", + {"message": "The comment was not found."}, + ) + + for entry in result: + if entry["value"].lower() == comment.lower(): + self.comment_sys_id = entry["sys_id"] + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The comment was found."}, + ) + return ( + 0, + False, + "", + {"message": "The comment was not found."}, + ) + + def teardown(self): + # revert the urgency to the initial value + if self.initial_incident_urgency is not None and self.config["updated_urgency"] != self.initial_incident_urgency: + try: + table_api_call( + instance=self.instance, + table="incident", + params={ + "sysparm_query": f"number={self.config['incident_number']}", + }, + data={ + "urgency": self.initial_incident_urgency, + "comments": "", # empty comments + }, + method="PUT", + ) + except HTTPError: + pass + + # remove the comment + if self.comment_sys_id is not None: + try: + db_delete_from_table( + instance=self.instance, + table="sys_journal_field", + sys_id=self.comment_sys_id, + ) + except HTTPError: + pass + + +class ResolveIncidentTask(ServiceNowIncidentTask): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.initial_incident_close_code = self._get_initial_incident_close_code() + + def _get_initial_incident_close_code(self): + + incident_number = self.config["incident_number"] + + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,number,close_code,close_notes", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"Incident {incident_number} not found") + + return result[0]["close_code"] + + + def all_configs(self): + return json.load(open(RESOLVE_INCIDENT_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + incident_number = self.config["incident_number"] + + # Query sc_req_item to check the RITM status + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={incident_number}", + "sysparm_fields": "sys_id,number,close_code,close_notes", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + return ( + 0, + False, + "", + {"message": "The incident was not found."}, + ) + + + # check if the close code is ok + if result[0]["close_code"] != self.config["close_code"]: + return ( + 0, + False, + "", + {"message": "The close code is not correct."}, + ) + + # check if the close notes is ok + if result[0]["close_notes"] != self.config["close_notes"]: + return ( + 0, + False, + "", + {"message": "The close notes are not correct."}, + ) + + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The incident was successfully resolved."}, + ) + + def teardown(self) -> None: + # reset the close code to the initial value + if self.initial_incident_close_code is not None and self.config["close_code"] != self.initial_incident_close_code: + try: + table_api_call( + instance=self.instance, + table="incident", + params={ + "sysparm_query": f"number={self.config['incident_number']}", + }, + data={ + "close_code": self.initial_incident_close_code, + "close_notes": "", # empty close notes + }, + method="PUT", + ) + except HTTPError: + # sys_id was stored in local storage (for submitted) + # but the record is absent from the database (probably invalid form) + pass + + +class CreateIncidentTasksTask(ServiceNowIncidentTask): + pass \ No newline at end of file From 46e2cd42bcae663f81ef153a572adfe9d75ff2cd Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 15:41:34 +0000 Subject: [PATCH 12/56] add validator and teardown for user group task --- src/browsergym/workarena/tasks/user_group.py | 108 +++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/browsergym/workarena/tasks/user_group.py diff --git a/src/browsergym/workarena/tasks/user_group.py b/src/browsergym/workarena/tasks/user_group.py new file mode 100644 index 0000000..b9ea949 --- /dev/null +++ b/src/browsergym/workarena/tasks/user_group.py @@ -0,0 +1,108 @@ + +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, db_delete_from_table, table_api_call +from ..config import ( + DEACTIVATE_USER_GROUP_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowUserGroupTask(AbstractServiceNowTask): + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + +class CreateUserGroupTask(ServiceNowUserGroupTask): + pass + + +class DeactivateUserGroupTask(ServiceNowUserGroupTask): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.user_group_sys_id = None + + def all_configs(self): + return json.load(open(DEACTIVATE_USER_GROUP_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + name = self.config["name"] + + # Query sn_customerservice_case in ServiceNow + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sys_user_group", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"name={name}", + "sysparm_fields": "sys_id,name,active", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + return ( + 0, + False, + "", + {"message": "The user group was not found."}, + ) + self.user_group_sys_id = result[0]["sys_id"] + + # check for active + if not result[0]["active"]: + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The user group was successfully deactivated."}, + ) + return ( + 0, + False, + "", + {"message": "The user group was not deactivated."}, + ) + + + def teardown(self) -> None: + try: + table_api_call( + instance=self.instance, + table="sys_user_group", + params={ + "sysparm_query": f"sys_id={self.user_group_sys_id}", + "sysparm_limit": 1, + }, + method="PUT", + data={"active": True}, + ) + except HTTPError: + pass + \ No newline at end of file From b8a7f7b092a50588f83940fd1a8ea4277514d751 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 15:54:59 +0000 Subject: [PATCH 13/56] add license task --- src/browsergym/workarena/tasks/license.py | 50 +++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/browsergym/workarena/tasks/license.py diff --git a/src/browsergym/workarena/tasks/license.py b/src/browsergym/workarena/tasks/license.py new file mode 100644 index 0000000..ae080d3 --- /dev/null +++ b/src/browsergym/workarena/tasks/license.py @@ -0,0 +1,50 @@ +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api + +from ..config import ( + GET_NUMBER_LICENSES_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowLicenseTask(AbstractServiceNowTask): + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + + +class GetNumberLicensesTask(ServiceNowLicenseTask): + + def all_configs(self): + return json.load(open(GET_NUMBER_LICENSES_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + num_licenses = self.config["number_of_licenses"] + + if str(num_licenses) in chat_messages[-1]["message"].lower(): + return (1, True, "Nice work, thank you!", {"message": "The number of licenses was successfully retrieved."}) + return (0, False, "", {"message": "The number of licenses was not retrieved."}) + + def teardown(self) -> None: + pass \ No newline at end of file From 134ca00d5fbc70a2242da6ec5c834d8d0c24b968 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 17:02:46 +0000 Subject: [PATCH 14/56] add change request and customer account tasks --- .../workarena/tasks/change_request.py | 138 ++++++++++++++++++ .../workarena/tasks/customer_account.py | 60 ++++++++ 2 files changed, 198 insertions(+) create mode 100644 src/browsergym/workarena/tasks/change_request.py create mode 100644 src/browsergym/workarena/tasks/customer_account.py diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py new file mode 100644 index 0000000..a297c17 --- /dev/null +++ b/src/browsergym/workarena/tasks/change_request.py @@ -0,0 +1,138 @@ + +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, table_api_call +from ..config import ( + CREATE_INTERACTION_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowChangeRequestTask(AbstractServiceNowTask): + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + +class ChangeChangeRequestApproverTask(ServiceNowChangeRequestTask): + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + self.change_request_sys_id = self._get_change_request_sys_id(self.config["change_number"]) + self.change_request_approver_sys_id = None + self.initial_change_request_approver_state = self._get_initial_change_request_approver_state(self.change_request_sys_id) + + def _get_initial_change_request_approver_state(self) -> str: + approvers = self._get_change_request_approvers_list(self.change_request_sys_id) + for approver in approvers: + if approver["approver"]["display_value"] == self.config["approver"]: + return approver["state"] + raise ValueError(f"Approver {self.config["approver"]} not found for change request {self.config["change_number"]}") + + def _get_change_request_sys_id(self, change_number: str) -> str: + response = requests.get( + f"{self.instance.snow_url}/api/now/table/change_request", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"number={change_number}", + "sysparm_fields": "sys_id,active", + "sysparm_limit": 1, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if not result: + raise ValueError(f"Change request {change_number} not found") + return result[0]["sys_id"] + + def _get_change_request_approvers_list(self, change_request_sys_id: str) -> List[str]: + + # list approvers for change request + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sysapproval_approver", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"sysapproval={change_request_sys_id}", + "sysparm_fields": "sys_id,approver,state", + "sysparm_display_value": "true", + "sysparm_limit": 100, + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + return result + + def all_configs(self): + return json.load(open(CHANGE_CHANGE_REQUEST_APPROVER_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + try: + approvers_list = self._get_change_request_approvers_list(self.change_request_sys_id) + except ValueError: + return ( + 0, + False, + "", + {"message": "The approvers for the change request were not found."}, + ) + + for row in approvers_list: + if row["approver"]["display_value"] == self.config["approver"] and row["state"] == "Requested": + self.change_request_approver_sys_id = row["sys_id"] + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The change request approver state was successfully changed."}, + ) + + return ( + 0, + False, + "", + {"message": "The change request approver state was not changed."}, + ) + + + def teardown(self) -> None: + # revert the change request approver state to the initial state + if self.change_request_approver_sys_id is not None: + try: + table_api_call( + instance=self.instance, + table="sysapproval_approver", + params={ + "sysparm_query": f"sys_id={self.change_request_approver_sys_id}", + "sysparm_limit": 1, + }, + method="PUT", + data={"state": self.initial_change_request_approver_state}, + ) + except HTTPError: + pass + \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/customer_account.py b/src/browsergym/workarena/tasks/customer_account.py new file mode 100644 index 0000000..6c891c4 --- /dev/null +++ b/src/browsergym/workarena/tasks/customer_account.py @@ -0,0 +1,60 @@ +import json +from typing import Any, Dict, List, Tuple + +import playwright.sync_api +import requests + +from ..api.utils import HTTPError, db_delete_from_table +from ..config import ( + CREATE_INTERACTION_CONFIG_PATH, +) +from .base import AbstractServiceNowTask + + +class ServiceNowCustomerAccountTask(AbstractServiceNowTask): + + + def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url: str = "/now/nav/ui/home") -> None: + super().__init__(seed, start_rel_url=start_rel_url) + self.task_is_setup = False + self.config = fixed_config if fixed_config else self.random.choice(self.all_configs()) + self.timeout = 60000 + self.created_sysids = [] + + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: + """Setup the task configuration and produce the goal.""" + + goal = self.config["goal"] + info = self.config + + return goal, info + + def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> None: + pass + + def all_configs(self): + raise NotImplementedError + + +class FindCustomerAccountManagerTask(ServiceNowCustomerAccountTask): + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + contact = self.config["contact"] + + if contact.lower() in chat_messages[-1]["message"].lower(): + return ( + 1, + True, + "", + {"message": "The customer account manager was successfully found."}, + ) + return ( + 0, + False, + "", + {"message": "The customer account manager was not found."}, + ) + + def teardown(self) -> None: + pass \ No newline at end of file From 3fd8767235f25d3f2821b138c7f8eab7a65715a9 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 10 Dec 2025 20:31:55 +0000 Subject: [PATCH 15/56] add navigation task with custom goal --- src/browsergym/workarena/tasks/navigation.py | 38 +++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/browsergym/workarena/tasks/navigation.py b/src/browsergym/workarena/tasks/navigation.py index 4028da8..19f1596 100644 --- a/src/browsergym/workarena/tasks/navigation.py +++ b/src/browsergym/workarena/tasks/navigation.py @@ -14,7 +14,7 @@ from ..api.utils import table_api_call from .base import AbstractServiceNowTask -from ..config import ALL_MENU_PATH, IMPERSONATION_CONFIG_PATH +from ..config import ALL_MENU_PATH, ALL_MENU_CUSTOM_GOAL_PATH, IMPERSONATION_CONFIG_PATH from ..instance import SNowInstance from ..utils import impersonate_user @@ -145,6 +145,42 @@ def validate( def teardown(self) -> None: pass +class AllMenuCustomGoalTask(AllMenuTask): + + def __init__( + self, *args, **kwargs + ) -> None: + super().__init__(*args, **kwargs) + with open(ALL_MENU_CUSTOM_GOAL_PATH, "r") as f: + self.all_configs = json.load(f) + + def setup_goal(self, page: Page) -> tuple[str, dict]: + + # Get task configuration + self.module = ( + self.fixed_config if self.fixed_config else self.random.choice(self.all_configs) + ) + + # When menu tasks do not need to be validated, the URL can be omitted from their config + self.final_url = self.instance.snow_url + self.module.get("url", "") + + # Generate goal + goal = self.module["goal"] + info = {} + + return goal, info + + def get_pretty_printed_description(self) -> str: + """ + Get the task info for this task when used in a private task; Used in L3 compositional tasks. + called by subclasses + """ + task_info = self.module["goal"] + + return task_info + + def cheat(self, page: Page, chat_messages: list[str]) -> None: + pass class ImpersonationTask(AbstractServiceNowTask): """ From 9c7bb09aa242eb61de81184f245127f3e00bf385 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 02:19:57 +0000 Subject: [PATCH 16/56] add configs for tasks --- src/browsergym/workarena/config.py | 45 +++++++++++++++++++ .../add_additional_assignee_to_incident.json | 17 +++++++ .../task_configs/change_chg_approver.json | 17 +++++++ .../task_configs/change_ritm_status.json | 17 +++++++ .../task_configs/create_interaction.json | 20 +++++++++ .../find_customer_account_manager.json | 17 +++++++ .../task_configs/get_number_licenses.json | 17 +++++++ .../data_files/task_configs/go_to_page.json | 17 +++++++ .../task_configs/resolve_incident.json | 26 +++++++++++ .../task_configs/update_incident.json | 20 +++++++++ .../task_configs/update_ritm_quantity.json | 23 ++++++++++ .../workarena/tasks/change_request.py | 2 +- .../workarena/tasks/customer_account.py | 9 ++-- src/browsergym/workarena/tasks/incident.py | 4 +- src/browsergym/workarena/tasks/user_group.py | 2 +- 15 files changed, 246 insertions(+), 7 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json create mode 100644 src/browsergym/workarena/data_files/task_configs/change_chg_approver.json create mode 100644 src/browsergym/workarena/data_files/task_configs/change_ritm_status.json create mode 100644 src/browsergym/workarena/data_files/task_configs/create_interaction.json create mode 100644 src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json create mode 100644 src/browsergym/workarena/data_files/task_configs/get_number_licenses.json create mode 100644 src/browsergym/workarena/data_files/task_configs/go_to_page.json create mode 100644 src/browsergym/workarena/data_files/task_configs/resolve_incident.json create mode 100644 src/browsergym/workarena/data_files/task_configs/update_incident.json create mode 100644 src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json diff --git a/src/browsergym/workarena/config.py b/src/browsergym/workarena/config.py index 11c97c1..4cb9a6c 100644 --- a/src/browsergym/workarena/config.py +++ b/src/browsergym/workarena/config.py @@ -19,6 +19,7 @@ # Path to the Menu navigation task configuration ALL_MENU_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu.json")) +ALL_MENU_CUSTOM_GOAL_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu_custom_goal.json")) # Path to the dashboard/report retrieval task configurations DASHBOARD_RETRIEVAL_MINMAX_CONFIG_PATH = str( @@ -258,4 +259,48 @@ ) ASSIGN_ROLES_TO_USER_IMPLICIT_CONFIG_PATH = str( resources.files(data_files).joinpath("task_configs/assign_roles_to_user_implicit.json") +) + +## License tasks +GET_NUMBER_LICENSES_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/get_number_licenses.json") +) + +## Change Request tasks +CHANGE_CHANGE_REQUEST_APPROVER_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/change_change_request_approver.json") +) + +## Incident tasks +ADD_ADDITIONAL_ASSIGNEE_TO_INCIDENT_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/add_additional_assignee_to_incident.json") +) +RESOLVE_INCIDENT_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/resolve_incident.json") +) +UPDATE_INCIDENT_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/update_incident.json") +) + +## Request Item tasks +CHANGE_RITM_STATUS_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/change_ritm_status.json") +) +UPDATE_RITM_QUANTITY_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/update_ritm_quantity.json") +) + +## Interaction tasks +CREATE_INTERACTION_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/create_interaction.json") +) + +## Customer account tasks +FIND_CUSTOMER_ACCOUNT_MANAGER_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/find_customer_account_manager.json") +) + +## User group tasks +DEACTIVATE_USER_GROUP_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/deactivate_user_group.json") ) \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json b/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json new file mode 100644 index 0000000..f38f43e --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json @@ -0,0 +1,17 @@ +[ + { + "additional_assignee_list": "Elmo Gabouer", + "incident_number": "INC0000002", + "goal": "Add Elmo Gabouer as an additional assignee on INC0000002" + }, + { + "additional_assignee_list": "Pat Hoshaw", + "incident_number": "INC0000016", + "goal": "Add Pat Hoshaw as an additional assignee on INC0000016" + }, + { + "additional_assignee_list": "Norman Betance", + "incident_number": "INC0000020", + "goal": "Add Norman Betance as an additional assignee on INC0000020" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json b/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json new file mode 100644 index 0000000..fa4a3aa --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json @@ -0,0 +1,17 @@ +[ + { + "change_number": "CHG0000077", + "approver": "Fred Luddy", + "goal": "Update change request CHG0000077 to get Fred Luddy's approval" + }, + { + "change_number": "CHG0000039", + "approver": "Bow Ruggeri", + "goal": "Update change request CHG0000039 to get Bow Ruggeri's approval" + }, + { + "change_number": "CHG0000086", + "approver": "David Dan", + "goal": "Update change request CHG0000086 to get David Dan's approval" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json b/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json new file mode 100644 index 0000000..a19531e --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json @@ -0,0 +1,17 @@ +[ + { + "ritm_number": "RITM0000002", + "approval": "approved", + "goal": "Change RITM0000002 approval status to approved" + }, + { + "ritm_number": "RITM0010002", + "approval": "rejected", + "goal": "Change RITM0010002 approval status to rejected" + }, + { + "ritm_number": "RITM0010003", + "approval": "requested", + "goal": "Change RITM0010003 approval status to requested" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/create_interaction.json b/src/browsergym/workarena/data_files/task_configs/create_interaction.json new file mode 100644 index 0000000..fb576ca --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_interaction.json @@ -0,0 +1,20 @@ +[ + { + "hardware": "laptop", + "hardware_issue": "The laptop screen won't turn on", + "assigned_to": "Kurtis Asberry", + "goal": "A customer called in about his laptop. The laptop screen won't turn on. Create an interaction based on the phone call and assign it to Kurtis Asberry" + }, + { + "hardware": "router", + "hardware_issue": "The router light is on but there is no Wifi", + "assigned_to": "Manifah Masood", + "goal": "A customer called in about his router. The router light is on but there is no Wifi. Create an interaction based on the phone call and assign it to Manifah Masood" + }, + { + "hardware": "keyboard", + "hardware_issue": "The keyboard's vowel keys are stuck", + "assigned_to": "Lacy Belmont", + "goal": "A customer called in about his keyboard. The keyboard's vowel keys are stuck. Create an interaction based on the phone call and assign it to Lacy Belmont" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json b/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json new file mode 100644 index 0000000..38f254e --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json @@ -0,0 +1,17 @@ +[ + { + "customer_account": "Tom Tom Networks", + "contact": "Tommy Gore", + "goal": "Find out who the contact for Tom Tom Networks is" + }, + { + "customer_account": "Spark Technologies", + "contact": "Amy Pascal", + "goal": "Find out who the contact for Spark Technologies is" + }, + { + "customer_account": "Diagonal Inc.", + "contact": "Denis Koch", + "goal": "Find out who the contact for Diagonal Inc. is" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json b/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json new file mode 100644 index 0000000..dbf06b0 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json @@ -0,0 +1,17 @@ +[ + { + "model": "Adobe Acrobat", + "number_of_licenses": 600, + "goal": "Get the number of licenses available for Adobe Acrobat" + }, + { + "model": "Skype", + "number_of_licenses": 550, + "goal": "Get the number of licenses available for Skype" + }, + { + "model": "Microsoft Office Home and Business 2010", + "number_of_licenses": 71, + "goal": "Get the number of licenses available for Microsoft Office Home and Business 2010" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/go_to_page.json b/src/browsergym/workarena/data_files/task_configs/go_to_page.json new file mode 100644 index 0000000..6377031 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/go_to_page.json @@ -0,0 +1,17 @@ +[ + { + "page": "the Contracts table", + "url": "/now/nav/ui/classic/params/target/ast_contract_list.do", + "goal": "Go to the Contracts table" + }, + { + "page": "the page that lists all SLA definitions", + "url": "/now/nav/ui/classic/params/target/contract_sla_list.do", + "goal": "Go to the page that lists all SLA definitions" + }, + { + "page": "where installed plugins and applications are listed", + "url": "/now/app-manager/home/tab/installed/sort/install_date", + "goal": "Go to where installed plugins and applications are listed" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/resolve_incident.json b/src/browsergym/workarena/data_files/task_configs/resolve_incident.json new file mode 100644 index 0000000..d39475f --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/resolve_incident.json @@ -0,0 +1,26 @@ +[ + { + "incident_number": "INC0000015", + "incident_caller": "Fred Luddy", + "issue": "being unable to launch his VPN client since the last software update", + "close_code": "Resolved by caller", + "close_notes": "Caller restarted laptop and was able to successfully launch the client", + "goal": "Resolve Fred Luddy's incident about being unable to launch his VPN client since the last software update. Choose \"Resolved by caller\" for the resolution code and put \"Caller restarted laptop and was able to successfully launch the client\" in the resolution notes" + }, + { + "incident_number": "INC0000025", + "incident_caller": "Don Goodliffe", + "issue": "adding more memory to his laptop", + "close_code": "Solution provided", + "close_notes": "Additional memory installed on caller's laptop during a walk-in appointment", + "goal": "Resolve Don Goodliffe's incident about adding more memory to his laptop. Choose \"Solution provided\" for the resolution code and put \"Additional memory installed on caller's laptop during a walk-in appointment\" in the resolution notes" + }, + { + "incident_number": "INC0000057", + "incident_caller": "Bertie Luby", + "issue": "performance problems with wifi", + "close_code": "User error", + "close_notes": "User was connected to a neighbor's wifi network", + "goal": "Resolve Bertie Luby's incident about performance problems with wifi. Choose \"User error\" for the resolution code and put \"User was connected to a neighbor's wifi network\" in the resolution notes" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/update_incident.json b/src/browsergym/workarena/data_files/task_configs/update_incident.json new file mode 100644 index 0000000..d05c9e1 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/update_incident.json @@ -0,0 +1,20 @@ +[ + { + "incident_number": "INC0000059", + "comment": "let's address this soon please", + "updated_urgency": 1, + "goal": "Comment on INC0000059 \"let's address this soon please\" and escalate its urgency" + }, + { + "incident_number": "INC0009009", + "comment": "can someone look at this?", + "updated_urgency": 1, + "goal": "Comment on INC0009009 \"can someone look at this?\" and escalate its urgency" + }, + { + "incident_number": "INC0000040", + "comment": "what's taking so long?", + "updated_urgency": 1, + "goal": "Comment on INC0000040 \"what's taking so long?\" and escalate its urgency" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json b/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json new file mode 100644 index 0000000..6f83017 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json @@ -0,0 +1,23 @@ +[ + { + "ritm_number": "RITM0010004", + "item_name": "privacy filter", + "stage": "approval", + "quantity": 500, + "goal": "Find the RITM for a privacy filter that's pending approval. Update the request to include 500 of the item instead of 1" + }, + { + "ritm_number": "RITM0000001", + "item_name": "Apple iPad 3", + "stage": "fulfillment", + "quantity": 5, + "goal": "Find the RITM for a Apple iPad 3 that's pending fulfillment. Update the request to include 5 of the item instead of 1" + }, + { + "ritm_number": "RITM0000005", + "item_name": "standard laptop", + "stage": "department head approval", + "quantity": 10, + "goal": "Find the RITM for a standard laptop that's pending department head approval. Update the request to include 10 of the item instead of 1" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py index a297c17..e947236 100644 --- a/src/browsergym/workarena/tasks/change_request.py +++ b/src/browsergym/workarena/tasks/change_request.py @@ -7,7 +7,7 @@ from ..api.utils import HTTPError, table_api_call from ..config import ( - CREATE_INTERACTION_CONFIG_PATH, + CHANGE_CHANGE_REQUEST_APPROVER_CONFIG_PATH, ) from .base import AbstractServiceNowTask diff --git a/src/browsergym/workarena/tasks/customer_account.py b/src/browsergym/workarena/tasks/customer_account.py index 6c891c4..a5146f6 100644 --- a/src/browsergym/workarena/tasks/customer_account.py +++ b/src/browsergym/workarena/tasks/customer_account.py @@ -2,11 +2,9 @@ from typing import Any, Dict, List, Tuple import playwright.sync_api -import requests -from ..api.utils import HTTPError, db_delete_from_table from ..config import ( - CREATE_INTERACTION_CONFIG_PATH, + FIND_CUSTOMER_ACCOUNT_MANAGER_CONFIG_PATH, ) from .base import AbstractServiceNowTask @@ -57,4 +55,7 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> ) def teardown(self) -> None: - pass \ No newline at end of file + pass + + def all_configs(self): + return json.load(open(FIND_CUSTOMER_ACCOUNT_MANAGER_CONFIG_PATH)) \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/incident.py b/src/browsergym/workarena/tasks/incident.py index 5ffeaf9..590014d 100644 --- a/src/browsergym/workarena/tasks/incident.py +++ b/src/browsergym/workarena/tasks/incident.py @@ -6,7 +6,9 @@ from ..api.utils import HTTPError, db_delete_from_table, table_api_call from ..config import ( - CREATE_INTERACTION_CONFIG_PATH, + ADD_ADDITIONAL_ASSIGNEE_TO_INCIDENT_CONFIG_PATH, + UPDATE_INCIDENT_CONFIG_PATH, + RESOLVE_INCIDENT_CONFIG_PATH, ) from .base import AbstractServiceNowTask diff --git a/src/browsergym/workarena/tasks/user_group.py b/src/browsergym/workarena/tasks/user_group.py index b9ea949..59b2c49 100644 --- a/src/browsergym/workarena/tasks/user_group.py +++ b/src/browsergym/workarena/tasks/user_group.py @@ -5,7 +5,7 @@ import playwright.sync_api import requests -from ..api.utils import HTTPError, db_delete_from_table, table_api_call +from ..api.utils import HTTPError, table_api_call from ..config import ( DEACTIVATE_USER_GROUP_CONFIG_PATH, ) From d663bd70e53b10ba77d187e7f9daf85b63dc531d Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 14:26:46 +0000 Subject: [PATCH 17/56] add new service catalog tasks --- src/browsergym/workarena/api/requests.py | 2 + src/browsergym/workarena/config.py | 31 +- .../data_files/task_configs/order_iphone.json | 52 +++ .../task_configs/order_misc_hardware.json | 27 ++ ..._hardware_with_business_justification.json | 32 ++ .../task_configs/order_mobile_phone.json | 37 ++ .../order_packaging_and_shipping.json | 37 ++ .../order_paper_and_supplies.json | 27 ++ .../task_configs/order_reset_password.json | 32 ++ .../task_configs/order_software.json | 27 ++ .../task_configs/order_software_access.json | 32 ++ .../workarena/tasks/service_catalog.py | 374 +++++++++++++++++- 12 files changed, 707 insertions(+), 3 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/order_iphone.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_misc_hardware.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_reset_password.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_software.json create mode 100644 src/browsergym/workarena/data_files/task_configs/order_software_access.json diff --git a/src/browsergym/workarena/api/requests.py b/src/browsergym/workarena/api/requests.py index d7dc124..b903b2d 100644 --- a/src/browsergym/workarena/api/requests.py +++ b/src/browsergym/workarena/api/requests.py @@ -125,10 +125,12 @@ def get_request_items(instance: SNowInstance, sys_id: str) -> list[dict]: "sysparm_fields": ",".join( [ "sys_id", + "cat_item", "short_description", "quantity", ] ), + "sysparm_display_value": "true", }, )["result"] diff --git a/src/browsergym/workarena/config.py b/src/browsergym/workarena/config.py index 4cb9a6c..e339f3b 100644 --- a/src/browsergym/workarena/config.py +++ b/src/browsergym/workarena/config.py @@ -303,4 +303,33 @@ ## User group tasks DEACTIVATE_USER_GROUP_CONFIG_PATH = str( resources.files(data_files).joinpath("task_configs/deactivate_user_group.json") -) \ No newline at end of file +) + +# service catalog tasks (dynamic guidance) +ORDER_IPHONE_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_iphone.json") +) +ORDER_MOBILE_PHONE_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_mobile_phone.json") +) +ORDER_MISC_HARDWARE_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_misc_hardware.json") +) +ORDER_MISC_HARDWARE_WITH_BUSINESS_JUSTIFICATION_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_misc_hardware_with_business_justification.json") +) +ORDER_PACKAGING_AND_SHIPPING_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_packaging_and_shipping.json") +) +ORDER_RESET_PASSWORD_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_reset_password.json") +) +ORDER_PAPER_SUPPLIES_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_paper_supplies.json") +) +ORDER_SOFTWARE_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_software.json") +) +ORDER_SOFTWARE_ACCESS_TASK_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/order_software_access.json") +) diff --git a/src/browsergym/workarena/data_files/task_configs/order_iphone.json b/src/browsergym/workarena/data_files/task_configs/order_iphone.json new file mode 100644 index 0000000..5d73ca0 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_iphone.json @@ -0,0 +1,52 @@ +[ + { + "color": "Starlight", + "model": "Apple iPhone 13", + "storage": "128 GB", + "replacement_reason": "I need it to replace my broken phone", + "replacement": true, + "quantity": 1, + "monthly_data_allowance": "500MB", + "goal": "Order a Starlight Apple iPhone 13 with 128 GB storage. I need it to replace my broken phone. Set the monthly data allowance to 500MB." + }, + { + "color": "Graphite", + "model": "Apple iPhone 13 Pro", + "storage": "256 GB", + "replacement_reason": "I broke my old phone", + "replacement": true, + "quantity": 1, + "monthly_data_allowance": "Unlimited", + "goal": "Order a Graphite Apple iPhone 13 Pro with 256 GB storage. I broke my old phone. Set the monthly data allowance to Unlimited." + }, + { + "color": "Midnight", + "model": "Apple iPhone 13", + "storage": "512 GB", + "replacement_reason": "I want a second phone", + "replacement": false, + "quantity": 1, + "monthly_data_allowance": "Unlimited", + "goal": "Order a Midnight Apple iPhone 13 with 512 GB storage. I want a second phone. Set the monthly data allowance to Unlimited." + }, + { + "color": "Sierra Blue", + "model": "Apple iPhone 13 Pro", + "storage": "128 GB", + "replacement_reason": "My old iphone is working, but I'm tired of it", + "replacement": false, + "quantity": 1, + "monthly_data_allowance": "500MB", + "goal": "Order a Sierra Blue Apple iPhone 13 Pro with 128 GB storage. My old iphone is working, but I'm tired of it. Set the monthly data allowance to 500MB." + }, + { + "color": "Alpine Green", + "model": "Apple iPhone 13 Pro", + "storage": "256 GB", + "replacement_reason": "I dropped my phone and it stopped working", + "replacement": true, + "quantity": 1, + "monthly_data_allowance": "500MB", + "goal": "Order a Alpine Green Apple iPhone 13 Pro with 256 GB storage. I dropped my phone and it stopped working. Set the monthly data allowance to 500MB." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_misc_hardware.json b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware.json new file mode 100644 index 0000000..0598b39 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware.json @@ -0,0 +1,27 @@ +[ + { + "item": "Brother Network-Ready Color Laser Printer", + "quantity": 1, + "goal": "I need you to get a Brother Network-Ready Color Laser Printer for me in the Service Catalog." + }, + { + "item": "Samsung Galaxy S22 Ultra 5G", + "quantity": 1, + "goal": "I need you to get a Samsung Galaxy S22 Ultra 5G for me in the Service Catalog." + }, + { + "item": "3M Privacy Filter - Lenovo X1 Carbon", + "quantity": 1, + "goal": "I need you to get a 3M Privacy Filter - Lenovo X1 Carbon for me in the Service Catalog." + }, + { + "item": "Standard 27\" Monitor", + "quantity": 1, + "goal": "I need you to get a Standard 27\" Monitor for me in the Service Catalog." + }, + { + "item": "StarTech USB to DVI Adapter", + "quantity": 1, + "goal": "I need you to get a StarTech USB to DVI Adapter for me in the Service Catalog." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json new file mode 100644 index 0000000..75f73ac --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json @@ -0,0 +1,32 @@ +[ + { + "item": "Apple USB-C charge cable", + "quantity": 1, + "business_justification": "I need a charge cable to charge my phone", + "goal": "Order a Apple USB-C charge cable from the Service Catalog. Set the business justification to \"I need a charge cable to charge my phone\"." + }, + { + "item": "USB-C power adapter", + "quantity": 1, + "business_justification": "I need a power adapter to charge my phone", + "goal": "Order a USB-C power adapter from the Service Catalog. Set the business justification to \"I need a power adapter to charge my phone\"." + }, + { + "item": "Cisco jabber softphone", + "quantity": 1, + "business_justification": "I need a softphone to make phone calls", + "goal": "Order a Cisco jabber softphone from the Service Catalog. Set the business justification to \"I need a softphone to make phone calls\"." + }, + { + "item": "Multiport AV adapter", + "quantity": 1, + "business_justification": "Needing a multiport AV adapter to connect my computer to a projector", + "goal": "Order a Multiport AV adapter from the Service Catalog. Set the business justification to \"Needing a multiport AV adapter to connect my computer to a projector\"." + }, + { + "item": "Wireless keyboard and mouse", + "quantity": 1, + "business_justification": "Can't find my keyboard and mouse", + "goal": "Order a Wireless keyboard and mouse from the Service Catalog. Set the business justification to \"Can't find my keyboard and mouse\"." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json b/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json new file mode 100644 index 0000000..b43b732 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json @@ -0,0 +1,37 @@ +[ + { + "color": "Mystic Blue", + "model": "Galaxy Note 20", + "storage": "128 GB", + "quantity": 1, + "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Blue with 128 GB of disk space." + }, + { + "color": "Mystic Bronze", + "model": "Galaxy Note 20", + "storage": "256 GB", + "quantity": 1, + "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Bronze with 256 GB of disk space." + }, + { + "color": "Mystic Green", + "model": "Galaxy Note 20", + "storage": "128 GB", + "quantity": 1, + "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Green with 128 GB of disk space." + }, + { + "color": "White", + "model": "Pixel 4a", + "storage": "512 GB", + "quantity": 1, + "goal": "I need a new phone. Order a Pixel 4a in White with 512 GB of disk space." + }, + { + "color": "Just Black", + "model": "Pixel 4a", + "storage": "256 GB", + "quantity": 1, + "goal": "I need a new phone. Order a Pixel 4a in Just Black with 256 GB of disk space." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json new file mode 100644 index 0000000..b095f1a --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json @@ -0,0 +1,37 @@ +[ + { + "shipping_type": "Inter-office", + "destination": "10369 Democracy Lane, Fairfax,VA", + "parcel_details": "a box of office supplies", + "parcel_keywords": "office supplies", + "goal": "I need to do a Inter-office shipment. The package ships to 10369 Democracy Lane, Fairfax,VA. The parcel contains {{item}}." + }, + { + "shipping_type": "Inter-office", + "destination": "Hyderabad", + "parcel_details": "a set of high performance laptops for the team to use", + "parcel_keywords": "laptop", + "goal": "I need to do a Inter-office shipment. The package ships to Hyderabad. The parcel contains {{item}}." + }, + { + "shipping_type": "External Address", + "destination": "7972 Pines Boulevard, Pembroke Pines,FL", + "parcel_details": "a bottle of wine", + "parcel_keywords": "bottle wine", + "goal": "I need to do a External Address shipment. The package ships to 7972 Pines Boulevard, Pembroke Pines,FL. The parcel contains {{item}}." + }, + { + "shipping_type": "External Address", + "destination": "SHS quadra 5, Bloco E., Brasilia", + "parcel_details": "a couple of Brother printers", + "parcel_keywords": "Brother printer", + "goal": "I need to do a External Address shipment. The package ships to SHS quadra 5, Bloco E., Brasilia. The parcel contains {{item}}." + }, + { + "shipping_type": "External Address", + "destination": "Seybold, 36 Northeast 1st Street #407, Miami,FL", + "parcel_details": "a thank you note", + "parcel_keywords": "thank you", + "goal": "I need to do a External Address shipment. The package ships to Seybold, 36 Northeast 1st Street #407, Miami,FL. The parcel contains {{item}}." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json b/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json new file mode 100644 index 0000000..0ab5c30 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json @@ -0,0 +1,27 @@ +[ + { + "item": "reams of paper", + "quantity": 3, + "goal": "We need office supplies! Order 3 reams of paper." + }, + { + "item": "boxes of pens", + "quantity": 2, + "goal": "We need office supplies! Order 2 boxes of pens." + }, + { + "item": "tubes of screen wipes", + "quantity": 4, + "goal": "We need office supplies! Order 4 tubes of screen wipes." + }, + { + "item": "boxes of pens", + "quantity": 2, + "goal": "We need office supplies! Order 2 boxes of pens." + }, + { + "item": "reams of paper", + "quantity": 5, + "goal": "We need office supplies! Order 5 reams of paper." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_reset_password.json b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json new file mode 100644 index 0000000..010cb3d --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json @@ -0,0 +1,32 @@ +[ + { + "software": "SAP Payroll", + "quantity": 1, + "contact": "Email", + "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Email." + }, + { + "software": "PeopleSoft CRM", + "quantity": 1, + "contact": "Telephone", + "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Telephone." + }, + { + "software": "Workday Enterprise Services", + "quantity": 1, + "contact": "SMS", + "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to SMS." + }, + { + "software": "Slack", + "quantity": 1, + "contact": "Email", + "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Email." + }, + { + "software": "Windows Mobile", + "quantity": 1, + "contact": "SMS", + "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to SMS." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_software.json b/src/browsergym/workarena/data_files/task_configs/order_software.json new file mode 100644 index 0000000..a9cb977 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_software.json @@ -0,0 +1,27 @@ +[ + { + "software": "Adobe Acrobat Pro", + "quantity": 1, + "goal": "Order Adobe Acrobat Pro in the Service Catalog." + }, + { + "software": "SnagIt", + "quantity": 1, + "goal": "Order SnagIt in the Service Catalog." + }, + { + "software": "QuickTime Pro", + "quantity": 1, + "goal": "Order QuickTime Pro in the Service Catalog." + }, + { + "software": "Visio Pro for Office 365", + "quantity": 1, + "goal": "Order Visio Pro for Office 365 in the Service Catalog." + }, + { + "software": "VMWare Fusion", + "quantity": 1, + "goal": "Order VMWare Fusion in the Service Catalog." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_software_access.json b/src/browsergym/workarena/data_files/task_configs/order_software_access.json new file mode 100644 index 0000000..259f43b --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/order_software_access.json @@ -0,0 +1,32 @@ +[ + { + "software": "Miro", + "quantity": 1, + "business_justification": "I need access to Miro to plan my next team meeting.", + "goal": "I need access to Miro. Give the following business justification: I need access to Miro to plan my next team meeting." + }, + { + "software": "DocuSign", + "quantity": 1, + "business_justification": "Give me access to DocuSign please!", + "goal": "I need access to DocuSign. Give the following business justification: Give me access to DocuSign please!" + }, + { + "software": "Dropbox", + "quantity": 1, + "business_justification": "Need to put files in the cloud.", + "goal": "I need access to Dropbox. Give the following business justification: Need to put files in the cloud." + }, + { + "software": "DocuSign", + "quantity": 1, + "business_justification": "Need to share contracts with customers for signatures.", + "goal": "I need access to DocuSign. Give the following business justification: Need to share contracts with customers for signatures." + }, + { + "software": "Dropbox", + "quantity": 1, + "business_justification": "I need to share files with my coworkers to collaborate.", + "goal": "I need access to Dropbox. Give the following business justification: I need to share files with my coworkers to collaborate." + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index a7921e8..d5e84bd 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -8,7 +8,7 @@ from typing import List import numpy as np import playwright.sync_api - +import requests from playwright.sync_api import Page import re from time import sleep @@ -16,7 +16,6 @@ from .base import AbstractServiceNowTask from .utils.form import fill_text - from ..api.requests import ( get_request_by_id, db_delete_from_table, @@ -31,6 +30,16 @@ ORDER_APPLE_MAC_BOOK_PRO15_TASK_CONFIG_PATH, ORDER_DEVELOPMENT_LAPTOP_PC_TASK_CONFIG_PATH, ORDER_LOANER_LAPTOP_TASK_CONFIG_PATH, + # dynamic guidance tasks + ORDER_IPHONE_TASK_CONFIG_PATH, + ORDER_MOBILE_PHONE_TASK_CONFIG_PATH, + ORDER_MISC_HARDWARE_TASK_CONFIG_PATH, + ORDER_MISC_HARDWARE_WITH_BUSINESS_JUSTIFICATION_TASK_CONFIG_PATH, + ORDER_PACKAGING_AND_SHIPPING_TASK_CONFIG_PATH, + ORDER_RESET_PASSWORD_TASK_CONFIG_PATH, + ORDER_PAPER_SUPPLIES_TASK_CONFIG_PATH, + ORDER_SOFTWARE_TASK_CONFIG_PATH, + ORDER_SOFTWARE_ACCESS_TASK_CONFIG_PATH, ) from ..instance import SNowInstance from .utils.utils import check_url_suffix_match @@ -657,6 +666,358 @@ def __init__(self, *args, **kwargs): ) +class OrderFromServiceCatalogTask(OrderHardwareTask): + """These tasks are organized slightly differently from the OrderHardwareTask tasks since we also sample the catalog item.""" + + def setup_goal(self, page: Page) -> tuple[str, dict]: + super().setup_goal(page=page) + + # Get the task configuration + assert self.all_configs is not None, "No configuration available for the task." + self.config = ( + self.fixed_config if self.fixed_config else self.random.choice(self.all_configs) + ) + + # Get goal from config + goal = self.config["goal"] + info = {} + + # Used to keep track of the sysid of the request for validation + self.request_sysid = None + + return goal, info + + def _get_requested_item(self, page: Page) -> dict | None: + + # Retrieve the request sysid from the URL + current_url = parse.urlparse(parse.unquote(page.evaluate("() => window.location.href"))) + (self.request_sysid,) = parse.parse_qs(current_url.query).get("sysparm_sys_id", [None]) + if self.request_sysid is None: + return None + + # Short sleep to make sure the data is saved in the DB + # TODO: improve this (noted in issue 291) + sleep(3) + r = get_request_by_id(instance=self.instance, sysid=self.request_sysid) + if r is None: + return None + + if len(r["items"]) != 1: + return None + (first_item,) = r["items"] + + return first_item + + +class OrderIphoneTask(OrderFromServiceCatalogTask): + config_path = ORDER_IPHONE_TASK_CONFIG_PATH + + FIELD_NAME_MAPPING = { + "Is this a replacement for a lost or broken iPhone?": "replacement", + "What was the original phone number?": "original_phone_number", + "Choose the colour": "color", + "Choose the storage": "storage", + "Monthly data allowance": "monthly_data_allowance", + } + + COLOR_MAPPING = { + # iphone 13 pro + "Alpine Green": "green", + "Silver": "silver", + "Gold": "gold", + "Graphite": "graphite", + "Sierra Blue": "sierra_blue", + # iphone 13 + "Green": "green", + "Pink": "pink", + "Blue": "blue", + "Midnight": "midnight", + "Starlight": "starlight", + "Red": "red", + } + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # go over values + if requested_item["options"][self.FIELD_NAME_MAPPING["Monthly data allowance"]] != self.config["monthly_data_allowance"]: + return 0, False, "", {"message": "The requested monthly data allowance is incorrect."} + + if requested_item["options"][self.FIELD_NAME_MAPPING["Is this a replacement for a lost or broken iPhone?"]] != self.config["replacement"]: + return 0, False, "", {"message": "The requested replacement status is incorrect."} + + # TODO: add replacement phone number in data + if requested_item["options"][self.FIELD_NAME_MAPPING["What was the original phone number?"]] != self.config["original_phone_number"]: + return 0, False, "", {"message": "The requested original phone number is incorrect."} + + if requested_item["options"][self.FIELD_NAME_MAPPING["color"]] != self.COLOR_MAPPING[self.config["color"]]: + # TODO: display color and config color is not the same + return 0, False, "", {"message": "The requested color is incorrect."} + + if requested_item["options"][self.FIELD_NAME_MAPPING["storage"]] != self.config["storage"].removesuffix(" GB"): + return 0, False, "", {"message": "The requested storage is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + + +class OrderMobilePhoneTask(OrderFromServiceCatalogTask): + config_path = ORDER_MOBILE_PHONE_TASK_CONFIG_PATH + + FIELD_NAME_MAPPING = { + "Choose the colour": "color", + "Choose the storage": "storage", + } + + COLOR_MAPPING = { + "Just Black": "black", + "White": "white", + "Mystic Green": "green", + "Mystic Blue": "blue", + "Mystic Bronze": "bronze", + } + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # go over values + + if requested_item["options"][self.FIELD_NAME_MAPPING["color"]] != self.COLOR_MAPPING[self.config["color"]]: + return 0, False, "", {"message": "The requested color is incorrect."} + + if requested_item["options"][self.FIELD_NAME_MAPPING["storage"]] != self.config["storage"].removesuffix(" GB"): + return 0, False, "", {"message": "The requested storage is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + + +class OrderMiscHardwareTask(OrderFromServiceCatalogTask): + config_path = ORDER_MISC_HARDWARE_TASK_CONFIG_PATH + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + +class OrderMiscHardwareWithBusinessJustificationTask(OrderFromServiceCatalogTask): + config_path = ORDER_MISC_HARDWARE_WITH_BUSINESS_JUSTIFICATION_TASK_CONFIG_PATH + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # NOTE: we don't check for `requested for` field. + + # business justification + if requested_item["options"]["Business justification"] != self.config["business_justification"]: + return 0, False, "", {"message": "The requested business justification is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + + +class OrderPaperSuppliesTask(OrderFromServiceCatalogTask): + config_path = ORDER_PAPER_SUPPLIES_TASK_CONFIG_PATH + + ITEM_NAME_MAPPING = { + "Pens (box of 10)": "boxes of pens", + "Copier paper (reams)": "reams of paper", + "Screen wipes (tube of 20)": "tubes of screen wipes", + } + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # check values + # we check only for 1 value. + # TODO: expand to multiple items at once + if str(requested_item["options"][self.ITEM_NAME_MAPPING[self.config["item"]]]) != str(self.config["number"]): + return 0, False, "", {"message": "The requested item and number is incorrect."} + + # NOTE: we don't look at `Additional requirements` field. + + return 1, True, "", {"message": "Task completed successfully."} + +class OrderResetPasswordTask(OrderFromServiceCatalogTask): + config_path = ORDER_RESET_PASSWORD_TASK_CONFIG_PATH + + def _get_incident_sys_id(self, page: Page) -> str | None: + # Retrieve the incident sysid from the URL + current_url = parse.urlparse(parse.unquote(page.evaluate("() => window.location.href"))) + (self.incident_sysid,) = parse.parse_qs(current_url.query).get("sys_id", [None]) + sleep(3) + + def _get_incident_short_description(self) -> str | None: + # get incident short description + response = requests.get( + f"{self.instance.snow_url}/api/now/table/incident", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"sys_id={self.incident_sysid}", + "sysparm_fields": "short_description", + }, + ) + response.raise_for_status() + result = response.json().get("result", {}) + return result.get("short_description") + + def _get_incident_work_notes(self) -> dict | None: + # get incident work notes + response = requests.get( + f"{self.instance.snow_url}/api/now/table/sys_journal_field", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"element_id={self.incident_sysid}^element=work_notes", + "sysparm_fields": "sys_id,value", + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + if len(result) != 1: + return None + + return result[0]["value"] + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + self._get_incident_sys_id(page) + if self.incident_sysid is None: + return 0, False, "", {"message": "The incident sysid is not found."} + + incident_short_description = self._get_incident_short_description() + incident_work_notes = self._get_incident_work_notes() + + # sanity check short description + if not incident_short_description.startswith("Reset the password"): + return 0, False, "", {"message": "The incident short description should start with 'Reset the password'."} + if not incident_short_description.endswith(self.config["item"]): + return 0, False, "", {"message": "The incident short description should end with the item name."} + + # sanity check work notes + if not f"System : {self.config["item"]}" in incident_work_notes: + return 0, False, "", {"message": "The incident work notes should contain the item name."} + if not f"Contact: {self.config["contact"]}" in incident_work_notes: + return 0, False, "", {"message": "The incident work notes should contain the contact method."} + + return 1, True, "", {"message": "Task completed successfully."} + +class OrderPackagingAndShippingTask(OrderFromServiceCatalogTask): + config_path = ORDER_PACKAGING_AND_SHIPPING_TASK_CONFIG_PATH + + FIELD_NAME_MAPPING = { + "Parcel details": "parcel_details", + "Shipping type": "shipping_type", + "Destination": "destination", + } + + SHIPPING_TYPE_MAPPING = { + "Inter-office": "internal", + "External Address": "external", + } + + def _get_location(self, location_sys_id: str): + + response = requests.get( + f"{self.instance.snow_url}/api/now/table/cmn_location", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + params={ + "sysparm_query": f"sys_id={location_sys_id}", + "sysparm_fields": "sys_id,name", + }, + ) + response.raise_for_status() + result = response.json().get("result", []) + return result[0]["name"] + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # validate values + if not requested_item[self.FIELD_NAME_MAPPING["shipping_type"]].lower() == self.SHIPPING_TYPE_MAPPING[self.config["shipping_type"]].lower(): + return 0, False, "", {"message": "The requested shipping type is incorrect."} + + # for destination, we need to do a lookup + # TODO: for now we only look at the destination field, but we could also setup the postcode, city, address line 1/2, etc. + destination = self._get_location(requested_item[self.FIELD_NAME_MAPPING["destination"]]) + if not destination.lower() == self.config["destination"].lower(): + return 0, False, "", {"message": "The requested destination is incorrect."} + + for keyword in self.config["keywords"].split(" "): + if not keyword.lower() in requested_item[self.FIELD_NAME_MAPPING["parcel_details"]].lower(): + return 0, False, "", {"message": "The requested parcel details does not contain the expected keyword."} + + return 1, True, "", {"message": "Task completed successfully."} + +class OrderSoftwareTask(OrderFromServiceCatalogTask): + config_path = ORDER_SOFTWARE_TASK_CONFIG_PATH + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + +class OrderSoftwareAccessTask(OrderFromServiceCatalogTask): + config_path = ORDER_SOFTWARE_ACCESS_TASK_CONFIG_PATH + + def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: + requested_item = self._get_requested_item(page) + + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + return 0, False, "", {"message": "The requested item is incorrect."} + + if not requested_item["quantity"] == self.config["quantity"]: + return 0, False, "", {"message": "The requested quantity is incorrect."} + + # NOTE: we don't check for `requested for` field. + + # business justification + if requested_item["options"]["Business justification"] != self.config["business_justification"]: + return 0, False, "", {"message": "The requested business justification is incorrect."} + + return 1, True, "", {"message": "Task completed successfully."} + + __TASKS__ = [ var for var in locals().values() @@ -667,4 +1028,13 @@ def __init__(self, *args, **kwargs): OrderAppleWatchTask, OrderDeveloperLaptopTask, OrderIpadProTask, + OrderIphoneTask, + OrderMobilePhoneTask, + OrderSoftwareAccessTask, + OrderSoftwareTask, + OrderResetPasswordTask, + OrderPackagingAndShippingTask, + OrderPaperSuppliesTask, + OrderMiscHardwareTask, + OrderMiscHardwareWithBusinessJustificationTask, ] \ No newline at end of file From 604db3d87f852812e4d575f8bf5e6c7c5e6736a0 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 14:44:42 +0000 Subject: [PATCH 18/56] add __TASKS__ variable at the bottom of files --- .../workarena/tasks/change_request.py | 6 +++++- .../workarena/tasks/customer_account.py | 6 +++++- src/browsergym/workarena/tasks/incident.py | 7 ++++++- src/browsergym/workarena/tasks/interaction.py | 7 ++++++- src/browsergym/workarena/tasks/license.py | 6 +++++- src/browsergym/workarena/tasks/navigation.py | 2 ++ src/browsergym/workarena/tasks/ritm.py | 7 ++++++- .../workarena/tasks/service_catalog.py | 11 +++++++++++ src/browsergym/workarena/tasks/user_group.py | 17 +++++++++-------- 9 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py index e947236..fea66c9 100644 --- a/src/browsergym/workarena/tasks/change_request.py +++ b/src/browsergym/workarena/tasks/change_request.py @@ -135,4 +135,8 @@ def teardown(self) -> None: ) except HTTPError: pass - \ No newline at end of file + + +__TASKS__ = [ + ChangeChangeRequestApproverTask, +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/customer_account.py b/src/browsergym/workarena/tasks/customer_account.py index a5146f6..4d17fe3 100644 --- a/src/browsergym/workarena/tasks/customer_account.py +++ b/src/browsergym/workarena/tasks/customer_account.py @@ -58,4 +58,8 @@ def teardown(self) -> None: pass def all_configs(self): - return json.load(open(FIND_CUSTOMER_ACCOUNT_MANAGER_CONFIG_PATH)) \ No newline at end of file + return json.load(open(FIND_CUSTOMER_ACCOUNT_MANAGER_CONFIG_PATH)) + +__TASKS__ = [ + FindCustomerAccountManagerTask, +] diff --git a/src/browsergym/workarena/tasks/incident.py b/src/browsergym/workarena/tasks/incident.py index 590014d..79d8e10 100644 --- a/src/browsergym/workarena/tasks/incident.py +++ b/src/browsergym/workarena/tasks/incident.py @@ -371,4 +371,9 @@ def teardown(self) -> None: class CreateIncidentTasksTask(ServiceNowIncidentTask): - pass \ No newline at end of file + pass + +__TASKS__ = [ + ResolveIncidentTask, + AddAdditionalAssigneeToIncidentTask, +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/interaction.py b/src/browsergym/workarena/tasks/interaction.py index 2cbafbe..bb10efb 100644 --- a/src/browsergym/workarena/tasks/interaction.py +++ b/src/browsergym/workarena/tasks/interaction.py @@ -90,4 +90,9 @@ def teardown(self) -> None: def all_configs(self): return json.load(open(CREATE_INTERACTION_CONFIG_PATH)) - \ No newline at end of file + + +__TASKS__ = [ + CreateInteractionTask, +] + \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/license.py b/src/browsergym/workarena/tasks/license.py index ae080d3..4fa8932 100644 --- a/src/browsergym/workarena/tasks/license.py +++ b/src/browsergym/workarena/tasks/license.py @@ -47,4 +47,8 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> return (0, False, "", {"message": "The number of licenses was not retrieved."}) def teardown(self) -> None: - pass \ No newline at end of file + pass + +__TASKS__ = [ + GetNumberLicensesTask, +] diff --git a/src/browsergym/workarena/tasks/navigation.py b/src/browsergym/workarena/tasks/navigation.py index 19f1596..c327e03 100644 --- a/src/browsergym/workarena/tasks/navigation.py +++ b/src/browsergym/workarena/tasks/navigation.py @@ -273,3 +273,5 @@ def teardown(self) -> None: __TASKS__ = [AllMenuTask, ImpersonationTask] + +__DYNAMIC_GUIDANCE_TASKS__ = [AllMenuCustomGoalTask] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/ritm.py b/src/browsergym/workarena/tasks/ritm.py index a05c5f6..06d8e58 100644 --- a/src/browsergym/workarena/tasks/ritm.py +++ b/src/browsergym/workarena/tasks/ritm.py @@ -231,4 +231,9 @@ def teardown(self) -> None: except HTTPError: # sys_id was stored in local storage (for submitted) # but the record is absent from the database (probably invalid form) - pass \ No newline at end of file + pass + +__TASKS__ = [ + ChangeRitmStatusTask, + UpdateRitmQuantityTask, +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index d5e84bd..36eb133 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -929,6 +929,17 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str return 1, True, "", {"message": "Task completed successfully."} + def teardown(self) -> None: + """ + Deletes the incident + """ + self._wait_for_ready(self.page) + + if hasattr(self, "incident_sysid") and self.incident_sysid is not None: + db_delete_from_table( + instance=self.instance, sys_id=self.incident_sysid, table="incident" + ) + class OrderPackagingAndShippingTask(OrderFromServiceCatalogTask): config_path = ORDER_PACKAGING_AND_SHIPPING_TASK_CONFIG_PATH diff --git a/src/browsergym/workarena/tasks/user_group.py b/src/browsergym/workarena/tasks/user_group.py index 59b2c49..970d0b7 100644 --- a/src/browsergym/workarena/tasks/user_group.py +++ b/src/browsergym/workarena/tasks/user_group.py @@ -1,4 +1,3 @@ - import json from typing import Any, Dict, List, Tuple @@ -6,9 +5,7 @@ import requests from ..api.utils import HTTPError, table_api_call -from ..config import ( - DEACTIVATE_USER_GROUP_CONFIG_PATH, -) +from ..config import DEACTIVATE_USER_GROUP_CONFIG_PATH from .base import AbstractServiceNowTask @@ -35,6 +32,7 @@ def cheat(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Non def all_configs(self): raise NotImplementedError + class CreateUserGroupTask(ServiceNowUserGroupTask): pass @@ -43,9 +41,9 @@ class DeactivateUserGroupTask(ServiceNowUserGroupTask): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - + self.user_group_sys_id = None - + def all_configs(self): return json.load(open(DEACTIVATE_USER_GROUP_CONFIG_PATH)) @@ -90,7 +88,6 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> {"message": "The user group was not deactivated."}, ) - def teardown(self) -> None: try: table_api_call( @@ -105,4 +102,8 @@ def teardown(self) -> None: ) except HTTPError: pass - \ No newline at end of file + + +__TASKS__ = [ + DeactivateUserGroupTask, +] From c660f3597c6350fcccbc39d186cd628d7d5bdb69 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 15:25:57 +0000 Subject: [PATCH 19/56] fix task configs files --- src/browsergym/workarena/__init__.py | 14 ++++++ .../data_files/task_configs/order_iphone.json | 45 ++++++++++--------- ..._hardware_with_business_justification.json | 10 ++--- .../task_configs/order_mobile_phone.json | 10 ++--- .../order_packaging_and_shipping.json | 20 ++++++--- .../order_paper_and_supplies.json | 30 ++++++++----- .../task_configs/order_reset_password.json | 30 ++++++------- .../task_configs/order_software.json | 10 ++--- .../task_configs/order_software_access.json | 20 ++++----- 9 files changed, 114 insertions(+), 75 deletions(-) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 15ad470..79f6105 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -23,10 +23,17 @@ from .tasks.knowledge import __TASKS__ as KB_TASKS from .tasks.list import __TASKS__ as LIST_TASKS from .tasks.navigation import __TASKS__ as NAVIGATION_TASKS +from .tasks.navigation import __DYNAMIC_GUIDANCE_TASKS__ as NAVIGATION_DYNAMIC_GUIDANCE_TASKS from .tasks.service_catalog import __TASKS__ as SERVICE_CATALOG_TASKS from .tasks.service_catalog import __DYNAMIC_GUIDANCE_TASKS__ as SERVICE_CATALOG_DYNAMIC_GUIDANCE_TASKS from .tasks.case import __TASKS__ as CASE_TASKS from .tasks.role import __TASKS__ as ROLE_TASKS +from .tasks.interaction import __TASKS__ as INTERACTION_TASKS +from .tasks.change_request import __TASKS__ as CHANGE_REQUEST_TASKS +from .tasks.customer_account import __TASKS__ as CUSTOMER_ACCOUNT_TASKS +from .tasks.incident import __TASKS__ as INCIDENT_TASKS +from .tasks.license import __TASKS__ as LICENSE_TASKS +from .tasks.ritm import __TASKS__ as RITM_TASKS from .tasks.compositional.base import CompositionalTask ALL_WORKARENA_TASKS = [ @@ -50,8 +57,15 @@ ALL_WORKARENA_DYNAMIC_GUIDANCE_TASKS = [ *SERVICE_CATALOG_DYNAMIC_GUIDANCE_TASKS, + *NAVIGATION_DYNAMIC_GUIDANCE_TASKS, *CASE_TASKS, *ROLE_TASKS, + *INTERACTION_TASKS, + *CHANGE_REQUEST_TASKS, + *CUSTOMER_ACCOUNT_TASKS, + *INCIDENT_TASKS, + *LICENSE_TASKS, + *RITM_TASKS, ] diff --git a/src/browsergym/workarena/data_files/task_configs/order_iphone.json b/src/browsergym/workarena/data_files/task_configs/order_iphone.json index 5d73ca0..4bbe239 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_iphone.json +++ b/src/browsergym/workarena/data_files/task_configs/order_iphone.json @@ -1,52 +1,57 @@ [ { + "item": "Apple iPhone 13", "color": "Starlight", - "model": "Apple iPhone 13", + "original_phone_number": "123-456-7890", "storage": "128 GB", "replacement_reason": "I need it to replace my broken phone", - "replacement": true, - "quantity": 1, + "replacement": "yes", "monthly_data_allowance": "500MB", - "goal": "Order a Starlight Apple iPhone 13 with 128 GB storage. I need it to replace my broken phone. Set the monthly data allowance to 500MB." + "quantity": 1, + "goal": "Order a Starlight Apple iPhone 13 with 128 GB storage. I need it to replace my broken phone. The old number was 123-456-7890. Set the monthly data allowance to 500MB." }, { + "item": "Apple iPhone 13 Pro", "color": "Graphite", - "model": "Apple iPhone 13 Pro", + "original_phone_number": "514-654-3210", "storage": "256 GB", "replacement_reason": "I broke my old phone", - "replacement": true, - "quantity": 1, + "replacement": "yes", "monthly_data_allowance": "Unlimited", - "goal": "Order a Graphite Apple iPhone 13 Pro with 256 GB storage. I broke my old phone. Set the monthly data allowance to Unlimited." + "quantity": 1, + "goal": "Order a Graphite Apple iPhone 13 Pro with 256 GB storage. I broke my old phone. The old number was 514-654-3210. Set the monthly data allowance to Unlimited." }, { + "item": "Apple iPhone 13", "color": "Midnight", - "model": "Apple iPhone 13", + "original_phone_number": "819-555-1212", "storage": "512 GB", "replacement_reason": "I want a second phone", - "replacement": false, - "quantity": 1, + "replacement": "no", "monthly_data_allowance": "Unlimited", - "goal": "Order a Midnight Apple iPhone 13 with 512 GB storage. I want a second phone. Set the monthly data allowance to Unlimited." + "quantity": 1, + "goal": "Order a Midnight Apple iPhone 13 with 512 GB storage. I want a second phone. The old number was 819-555-1212. Set the monthly data allowance to Unlimited." }, { + "item": "Apple iPhone 13 Pro", "color": "Sierra Blue", - "model": "Apple iPhone 13 Pro", + "original_phone_number": "613-321-4567", "storage": "128 GB", "replacement_reason": "My old iphone is working, but I'm tired of it", - "replacement": false, - "quantity": 1, + "replacement": "no", "monthly_data_allowance": "500MB", - "goal": "Order a Sierra Blue Apple iPhone 13 Pro with 128 GB storage. My old iphone is working, but I'm tired of it. Set the monthly data allowance to 500MB." + "quantity": 1, + "goal": "Order a Sierra Blue Apple iPhone 13 Pro with 128 GB storage. My old iphone is working, but I'm tired of it. The old number was 613-321-4567. Set the monthly data allowance to 500MB." }, { + "item": "Apple iPhone 13 Pro", "color": "Alpine Green", - "model": "Apple iPhone 13 Pro", + "original_phone_number": "905-555-6789", "storage": "256 GB", "replacement_reason": "I dropped my phone and it stopped working", - "replacement": true, - "quantity": 1, + "replacement": "yes", "monthly_data_allowance": "500MB", - "goal": "Order a Alpine Green Apple iPhone 13 Pro with 256 GB storage. I dropped my phone and it stopped working. Set the monthly data allowance to 500MB." + "quantity": 1, + "goal": "Order a Alpine Green Apple iPhone 13 Pro with 256 GB storage. I dropped my phone and it stopped working. The old number was 905-555-6789. Set the monthly data allowance to 500MB." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json index 75f73ac..d320859 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json +++ b/src/browsergym/workarena/data_files/task_configs/order_misc_hardware_with_business_justification.json @@ -1,32 +1,32 @@ [ { "item": "Apple USB-C charge cable", - "quantity": 1, "business_justification": "I need a charge cable to charge my phone", + "quantity": 1, "goal": "Order a Apple USB-C charge cable from the Service Catalog. Set the business justification to \"I need a charge cable to charge my phone\"." }, { "item": "USB-C power adapter", - "quantity": 1, "business_justification": "I need a power adapter to charge my phone", + "quantity": 1, "goal": "Order a USB-C power adapter from the Service Catalog. Set the business justification to \"I need a power adapter to charge my phone\"." }, { "item": "Cisco jabber softphone", - "quantity": 1, "business_justification": "I need a softphone to make phone calls", + "quantity": 1, "goal": "Order a Cisco jabber softphone from the Service Catalog. Set the business justification to \"I need a softphone to make phone calls\"." }, { "item": "Multiport AV adapter", - "quantity": 1, "business_justification": "Needing a multiport AV adapter to connect my computer to a projector", + "quantity": 1, "goal": "Order a Multiport AV adapter from the Service Catalog. Set the business justification to \"Needing a multiport AV adapter to connect my computer to a projector\"." }, { "item": "Wireless keyboard and mouse", - "quantity": 1, "business_justification": "Can't find my keyboard and mouse", + "quantity": 1, "goal": "Order a Wireless keyboard and mouse from the Service Catalog. Set the business justification to \"Can't find my keyboard and mouse\"." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json b/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json index b43b732..5947296 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json +++ b/src/browsergym/workarena/data_files/task_configs/order_mobile_phone.json @@ -1,35 +1,35 @@ [ { + "item": "Galaxy Note 20", "color": "Mystic Blue", - "model": "Galaxy Note 20", "storage": "128 GB", "quantity": 1, "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Blue with 128 GB of disk space." }, { + "item": "Galaxy Note 20", "color": "Mystic Bronze", - "model": "Galaxy Note 20", "storage": "256 GB", "quantity": 1, "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Bronze with 256 GB of disk space." }, { + "item": "Galaxy Note 20", "color": "Mystic Green", - "model": "Galaxy Note 20", "storage": "128 GB", "quantity": 1, "goal": "I need a new phone. Order a Galaxy Note 20 in Mystic Green with 128 GB of disk space." }, { + "item": "Pixel 4a", "color": "White", - "model": "Pixel 4a", "storage": "512 GB", "quantity": 1, "goal": "I need a new phone. Order a Pixel 4a in White with 512 GB of disk space." }, { + "item": "Pixel 4a", "color": "Just Black", - "model": "Pixel 4a", "storage": "256 GB", "quantity": 1, "goal": "I need a new phone. Order a Pixel 4a in Just Black with 256 GB of disk space." diff --git a/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json index b095f1a..d391420 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json +++ b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json @@ -1,37 +1,47 @@ [ { + "item": "Packaging and Shipping", "shipping_type": "Inter-office", "destination": "10369 Democracy Lane, Fairfax,VA", "parcel_details": "a box of office supplies", "parcel_keywords": "office supplies", - "goal": "I need to do a Inter-office shipment. The package ships to 10369 Democracy Lane, Fairfax,VA. The parcel contains {{item}}." + "quantity": 1, + "goal": "I need to do a Inter-office shipment. The package ships to 10369 Democracy Lane, Fairfax,VA. The parcel contains Packaging and Shipping." }, { + "item": "Packaging and Shipping", "shipping_type": "Inter-office", "destination": "Hyderabad", "parcel_details": "a set of high performance laptops for the team to use", "parcel_keywords": "laptop", - "goal": "I need to do a Inter-office shipment. The package ships to Hyderabad. The parcel contains {{item}}." + "quantity": 1, + "goal": "I need to do a Inter-office shipment. The package ships to Hyderabad. The parcel contains Packaging and Shipping." }, { + "item": "Packaging and Shipping", "shipping_type": "External Address", "destination": "7972 Pines Boulevard, Pembroke Pines,FL", "parcel_details": "a bottle of wine", "parcel_keywords": "bottle wine", - "goal": "I need to do a External Address shipment. The package ships to 7972 Pines Boulevard, Pembroke Pines,FL. The parcel contains {{item}}." + "quantity": 1, + "goal": "I need to do a External Address shipment. The package ships to 7972 Pines Boulevard, Pembroke Pines,FL. The parcel contains Packaging and Shipping." }, { + "item": "Packaging and Shipping", "shipping_type": "External Address", "destination": "SHS quadra 5, Bloco E., Brasilia", "parcel_details": "a couple of Brother printers", "parcel_keywords": "Brother printer", - "goal": "I need to do a External Address shipment. The package ships to SHS quadra 5, Bloco E., Brasilia. The parcel contains {{item}}." + "quantity": 1, + "goal": "I need to do a External Address shipment. The package ships to SHS quadra 5, Bloco E., Brasilia. The parcel contains Packaging and Shipping." }, { + "item": "Packaging and Shipping", "shipping_type": "External Address", "destination": "Seybold, 36 Northeast 1st Street #407, Miami,FL", "parcel_details": "a thank you note", "parcel_keywords": "thank you", - "goal": "I need to do a External Address shipment. The package ships to Seybold, 36 Northeast 1st Street #407, Miami,FL. The parcel contains {{item}}." + "quantity": 1, + "goal": "I need to do a External Address shipment. The package ships to Seybold, 36 Northeast 1st Street #407, Miami,FL. The parcel contains Packaging and Shipping." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json b/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json index 0ab5c30..a49608d 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json +++ b/src/browsergym/workarena/data_files/task_configs/order_paper_and_supplies.json @@ -1,27 +1,37 @@ [ { - "item": "reams of paper", - "quantity": 3, + "item": "Paper and Supplies", + "supplies": "reams of paper", + "number": 3, + "quantity": 1, "goal": "We need office supplies! Order 3 reams of paper." }, { - "item": "boxes of pens", - "quantity": 2, + "item": "Paper and Supplies", + "supplies": "boxes of pens", + "number": 2, + "quantity": 1, "goal": "We need office supplies! Order 2 boxes of pens." }, { - "item": "tubes of screen wipes", - "quantity": 4, + "item": "Paper and Supplies", + "supplies": "tubes of screen wipes", + "number": 4, + "quantity": 1, "goal": "We need office supplies! Order 4 tubes of screen wipes." }, { - "item": "boxes of pens", - "quantity": 2, + "item": "Paper and Supplies", + "supplies": "boxes of pens", + "number": 2, + "quantity": 1, "goal": "We need office supplies! Order 2 boxes of pens." }, { - "item": "reams of paper", - "quantity": 5, + "item": "Paper and Supplies", + "supplies": "reams of paper", + "number": 5, + "quantity": 1, "goal": "We need office supplies! Order 5 reams of paper." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_reset_password.json b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json index 010cb3d..3a8e179 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_reset_password.json +++ b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json @@ -1,32 +1,32 @@ [ { - "software": "SAP Payroll", - "quantity": 1, + "item": "SAP Payroll", "contact": "Email", - "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Email." + "quantity": 1, + "goal": "Help me reset my password for SAP Payroll by submitting a request through the Service Catalog. Send the reset instructions to Email." }, { - "software": "PeopleSoft CRM", - "quantity": 1, + "item": "PeopleSoft CRM", "contact": "Telephone", - "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Telephone." + "quantity": 1, + "goal": "Help me reset my password for PeopleSoft CRM by submitting a request through the Service Catalog. Send the reset instructions to Telephone." }, { - "software": "Workday Enterprise Services", - "quantity": 1, + "item": "Workday Enterprise Services", "contact": "SMS", - "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to SMS." + "quantity": 1, + "goal": "Help me reset my password for Workday Enterprise Services by submitting a request through the Service Catalog. Send the reset instructions to SMS." }, { - "software": "Slack", - "quantity": 1, + "item": "Slack", "contact": "Email", - "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to Email." + "quantity": 1, + "goal": "Help me reset my password for Slack by submitting a request through the Service Catalog. Send the reset instructions to Email." }, { - "software": "Windows Mobile", - "quantity": 1, + "item": "Windows Mobile", "contact": "SMS", - "goal": "Help me reset my password for {{application}} by submitting a request through the Service Catalog. Send the reset instructions to SMS." + "quantity": 1, + "goal": "Help me reset my password for Windows Mobile by submitting a request through the Service Catalog. Send the reset instructions to SMS." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_software.json b/src/browsergym/workarena/data_files/task_configs/order_software.json index a9cb977..deff626 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_software.json +++ b/src/browsergym/workarena/data_files/task_configs/order_software.json @@ -1,26 +1,26 @@ [ { - "software": "Adobe Acrobat Pro", + "item": "Adobe Acrobat Pro", "quantity": 1, "goal": "Order Adobe Acrobat Pro in the Service Catalog." }, { - "software": "SnagIt", + "item": "SnagIt", "quantity": 1, "goal": "Order SnagIt in the Service Catalog." }, { - "software": "QuickTime Pro", + "item": "QuickTime Pro", "quantity": 1, "goal": "Order QuickTime Pro in the Service Catalog." }, { - "software": "Visio Pro for Office 365", + "item": "Visio Pro for Office 365", "quantity": 1, "goal": "Order Visio Pro for Office 365 in the Service Catalog." }, { - "software": "VMWare Fusion", + "item": "VMWare Fusion", "quantity": 1, "goal": "Order VMWare Fusion in the Service Catalog." } diff --git a/src/browsergym/workarena/data_files/task_configs/order_software_access.json b/src/browsergym/workarena/data_files/task_configs/order_software_access.json index 259f43b..f4462f0 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_software_access.json +++ b/src/browsergym/workarena/data_files/task_configs/order_software_access.json @@ -1,32 +1,32 @@ [ { - "software": "Miro", - "quantity": 1, + "item": "Miro", "business_justification": "I need access to Miro to plan my next team meeting.", + "quantity": 1, "goal": "I need access to Miro. Give the following business justification: I need access to Miro to plan my next team meeting." }, { - "software": "DocuSign", - "quantity": 1, + "item": "DocuSign", "business_justification": "Give me access to DocuSign please!", + "quantity": 1, "goal": "I need access to DocuSign. Give the following business justification: Give me access to DocuSign please!" }, { - "software": "Dropbox", - "quantity": 1, + "item": "Dropbox", "business_justification": "Need to put files in the cloud.", + "quantity": 1, "goal": "I need access to Dropbox. Give the following business justification: Need to put files in the cloud." }, { - "software": "DocuSign", - "quantity": 1, + "item": "DocuSign", "business_justification": "Need to share contracts with customers for signatures.", + "quantity": 1, "goal": "I need access to DocuSign. Give the following business justification: Need to share contracts with customers for signatures." }, { - "software": "Dropbox", - "quantity": 1, + "item": "Dropbox", "business_justification": "I need to share files with my coworkers to collaborate.", + "quantity": 1, "goal": "I need access to Dropbox. Give the following business justification: I need to share files with my coworkers to collaborate." } ] \ No newline at end of file From 20783a44f3bf16c5b8c8e688943b68041950108b Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 15:26:21 +0000 Subject: [PATCH 20/56] fix double quote in f string issue --- src/browsergym/workarena/tasks/change_request.py | 2 +- src/browsergym/workarena/tasks/service_catalog.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py index fea66c9..7975ad1 100644 --- a/src/browsergym/workarena/tasks/change_request.py +++ b/src/browsergym/workarena/tasks/change_request.py @@ -49,7 +49,7 @@ def _get_initial_change_request_approver_state(self) -> str: for approver in approvers: if approver["approver"]["display_value"] == self.config["approver"]: return approver["state"] - raise ValueError(f"Approver {self.config["approver"]} not found for change request {self.config["change_number"]}") + raise ValueError(f"Approver {self.config['approver']} not found for change request {self.config['change_number']}") def _get_change_request_sys_id(self, change_number: str) -> str: response = requests.get( diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 36eb133..06e20ac 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -922,9 +922,9 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str return 0, False, "", {"message": "The incident short description should end with the item name."} # sanity check work notes - if not f"System : {self.config["item"]}" in incident_work_notes: + if not f"System : {self.config['item']}" in incident_work_notes: return 0, False, "", {"message": "The incident work notes should contain the item name."} - if not f"Contact: {self.config["contact"]}" in incident_work_notes: + if not f"Contact: {self.config['contact']}" in incident_work_notes: return 0, False, "", {"message": "The incident work notes should contain the contact method."} return 1, True, "", {"message": "Task completed successfully."} From 3748ac80d87bbae1e6c454ed2b71d6f24429c54c Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 15:52:59 +0000 Subject: [PATCH 21/56] fix issues with new service catalog tasks --- src/browsergym/workarena/__init__.py | 11 +++++++ .../workarena/tasks/service_catalog.py | 32 ++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 79f6105..cd7f642 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -120,6 +120,17 @@ "workarena.servicenow.multi-chart-value-retrieval": "dashboard", "workarena.servicenow.single-chart-value-retrieval": "dashboard", "workarena.servicenow.single-chart-min-max-retrieval": "dashboard", + # dynamic guidance tasks + "workarena.servicenow.order-iphone": "service catalog", + "workarena.servicenow.order-mobile-phone": "service catalog", + "workarena.servicenow.order-software": "service catalog", + "workarena.servicenow.order-software-access": "service catalog", + "workarena.servicenow.order-reset-password": "service catalog", + "workarena.servicenow.order-packaging-and-shipping": "service catalog", + "workarena.servicenow.order-paper-supplies": "service catalog", + "workarena.servicenow.order-misc-hardware": "service catalog", + "workarena.servicenow.order-misc-hardware-with-business-justification": "service catalog", + "workarena.servicenow.order-reset-password": "service catalog", } diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 06e20ac..4d4d5ec 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -670,7 +670,7 @@ class OrderFromServiceCatalogTask(OrderHardwareTask): """These tasks are organized slightly differently from the OrderHardwareTask tasks since we also sample the catalog item.""" def setup_goal(self, page: Page) -> tuple[str, dict]: - super().setup_goal(page=page) + AbstractServiceNowTask.setup_goal(self, page=page) # Get the task configuration assert self.all_configs is not None, "No configuration available for the task." @@ -738,6 +738,8 @@ class OrderIphoneTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -784,7 +786,9 @@ class OrderMobilePhoneTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -807,7 +811,9 @@ class OrderMiscHardwareTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -821,7 +827,9 @@ class OrderMiscHardwareWithBusinessJustificationTask(OrderFromServiceCatalogTask def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -848,7 +856,9 @@ class OrderPaperSuppliesTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -971,7 +981,9 @@ def _get_location(self, location_sys_id: str): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -999,7 +1011,9 @@ class OrderSoftwareTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} @@ -1013,7 +1027,9 @@ class OrderSoftwareAccessTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - + if requested_item is None: + return 0, False, "", {"message": "The requested item is incorrect."} + if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} From daf38d3766c3284f067707fa137fc6878b353c85 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 17:05:10 +0000 Subject: [PATCH 22/56] bug fixes --- src/browsergym/workarena/config.py | 6 +++--- src/browsergym/workarena/tasks/change_request.py | 2 +- src/browsergym/workarena/tasks/interaction.py | 2 +- src/browsergym/workarena/tasks/service_catalog.py | 4 +++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/browsergym/workarena/config.py b/src/browsergym/workarena/config.py index e339f3b..6851db6 100644 --- a/src/browsergym/workarena/config.py +++ b/src/browsergym/workarena/config.py @@ -19,7 +19,7 @@ # Path to the Menu navigation task configuration ALL_MENU_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu.json")) -ALL_MENU_CUSTOM_GOAL_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu_custom_goal.json")) +ALL_MENU_CUSTOM_GOAL_PATH = str(resources.files(data_files).joinpath("task_configs/go_to_page.json")) # Path to the dashboard/report retrieval task configurations DASHBOARD_RETRIEVAL_MINMAX_CONFIG_PATH = str( @@ -268,7 +268,7 @@ ## Change Request tasks CHANGE_CHANGE_REQUEST_APPROVER_CONFIG_PATH = str( - resources.files(data_files).joinpath("task_configs/change_change_request_approver.json") + resources.files(data_files).joinpath("task_configs/change_chg_approver.json") ) ## Incident tasks @@ -325,7 +325,7 @@ resources.files(data_files).joinpath("task_configs/order_reset_password.json") ) ORDER_PAPER_SUPPLIES_TASK_CONFIG_PATH = str( - resources.files(data_files).joinpath("task_configs/order_paper_supplies.json") + resources.files(data_files).joinpath("task_configs/order_paper_and_supplies.json") ) ORDER_SOFTWARE_TASK_CONFIG_PATH = str( resources.files(data_files).joinpath("task_configs/order_software.json") diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py index 7975ad1..784ad80 100644 --- a/src/browsergym/workarena/tasks/change_request.py +++ b/src/browsergym/workarena/tasks/change_request.py @@ -42,7 +42,7 @@ def __init__(self, *args, **kwargs) -> None: self.change_request_sys_id = self._get_change_request_sys_id(self.config["change_number"]) self.change_request_approver_sys_id = None - self.initial_change_request_approver_state = self._get_initial_change_request_approver_state(self.change_request_sys_id) + self.initial_change_request_approver_state = self._get_initial_change_request_approver_state() def _get_initial_change_request_approver_state(self) -> str: approvers = self._get_change_request_approvers_list(self.change_request_sys_id) diff --git a/src/browsergym/workarena/tasks/interaction.py b/src/browsergym/workarena/tasks/interaction.py index bb10efb..bb4cc31 100644 --- a/src/browsergym/workarena/tasks/interaction.py +++ b/src/browsergym/workarena/tasks/interaction.py @@ -39,7 +39,7 @@ class CreateInteractionTask(ServiceNowInteractionTask): def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: # get customer problem from config - customer_problem = self.config["customer_problem"] + customer_problem = self.config["hardware_issue"] # Query interaction table using LIKE operator # TODO: difficult to verify and test diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 4d4d5ec..088accc 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -924,6 +924,8 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str incident_short_description = self._get_incident_short_description() incident_work_notes = self._get_incident_work_notes() + if incident_short_description is None or incident_work_notes is None: + return 0, False, "", {"message": "The incident short description or work notes is not found."} # sanity check short description if not incident_short_description.startswith("Reset the password"): @@ -1048,7 +1050,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str __TASKS__ = [ var for var in locals().values() - if isinstance(var, type) and issubclass(var, OrderHardwareTask) and var is not OrderHardwareTask + if isinstance(var, type) and issubclass(var, OrderHardwareTask) and var is not OrderHardwareTask and not issubclass(var, OrderFromServiceCatalogTask) ] __DYNAMIC_GUIDANCE_TASKS__ = [ From 37bdc29d085485030628edcbc9c330018c0a2195 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 18:38:19 +0000 Subject: [PATCH 23/56] bugfix role tasks --- src/browsergym/workarena/tasks/role.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 18301b3..7c463ec 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -67,8 +67,8 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> # query sys_user_has_role to find user roles response = requests.get( - f"{instance_url}/api/now/table/sys_user_has_role", - auth=(snow_username, snow_password), + f"{self.instance.snow_url}/api/now/table/sys_user_has_role", + auth=self.instance.snow_credentials, headers={"Accept": "application/json"}, params={ "sysparm_query": f"user={user_sys_id}", From 8a93460f74c4c2a4c39defbe45e413e283cc1f75 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 11:01:12 -0500 Subject: [PATCH 24/56] add samples --- .../task_configs/assign_role_to_user_admin.json | 10 ++++++++++ .../task_configs/assign_roles_to_user_explicit.json | 10 ++++++++++ .../task_configs/assign_roles_to_user_implicit.json | 12 ++++++++++++ 3 files changed, 32 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json b/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json index 3d2a0fd..4df5a10 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json @@ -13,5 +13,15 @@ "user_full_name": "Roger Seid", "roles": "admin", "goal": "Assign Roger Seid the admin role" + }, + { + "user_full_name": "Alisa Chinoy", + "roles": "admin", + "goal": "Assign Alisa Chinoy the admin role" + }, + { + "user_full_name": "Chi Greenlaw", + "roles": "admin", + "goal": "Assign Chi Greenlaw the admin role" } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json index 1db0612..4792ae2 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json @@ -13,5 +13,15 @@ "user_full_name": "Yvette Kokoska", "roles": "canvas_admin, canvas_user", "goal": "Assign Yvette Kokoska the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Don Mestler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Don Mestler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ella Pahnke", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ella Pahnke the following roles: canvas_admin, canvas_user" } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json index 766fb95..eea84af 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json @@ -16,5 +16,17 @@ "role_family": "sn_incident", "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", "goal": "Assign Kerry Evertt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Miquel Demicco", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Miquel Demicco all of the \"sn_incident\" roles" + }, + { + "user_full_name": "William Mahmud", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign William Mahmud all of the \"sn_incident\" roles" } ] \ No newline at end of file From 41b5feb24ff0f03a99bfb67b706a0cfd15978ff3 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 12:45:14 -0500 Subject: [PATCH 25/56] add samples --- .../add_additional_assignee_to_incident.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json b/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json index f38f43e..1a5a211 100644 --- a/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json +++ b/src/browsergym/workarena/data_files/task_configs/add_additional_assignee_to_incident.json @@ -13,5 +13,15 @@ "additional_assignee_list": "Norman Betance", "incident_number": "INC0000020", "goal": "Add Norman Betance as an additional assignee on INC0000020" + }, + { + "additional_assignee_list": "Chris Walls", + "incident_number": "INC0000046", + "goal": "Add Chris Walls as an additional assignee on INC0000046" + }, + { + "additional_assignee_list": "Olivia Jenkins", + "incident_number": "INC0000047", + "goal": "Add Olivia Jenkins as an additional assignee on INC0000047" } ] \ No newline at end of file From b5b88b349a7cd56df9eaf491f38c3a37254cf5bc Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 12:59:59 -0500 Subject: [PATCH 26/56] add samples --- .../data_files/task_configs/change_chg_approver.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json b/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json index fa4a3aa..7a9e832 100644 --- a/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json +++ b/src/browsergym/workarena/data_files/task_configs/change_chg_approver.json @@ -13,5 +13,15 @@ "change_number": "CHG0000086", "approver": "David Dan", "goal": "Update change request CHG0000086 to get David Dan's approval" + }, + { + "change_number": "CHG0000040", + "approver": "Beth Anglin", + "goal": "Update change request CHG0000040 to get Beth Anglin's approval" + }, + { + "change_number": "CHG0000044", + "approver": "Don Goodliffe", + "goal": "Update change request CHG0000044 to get Don Goodliffe's approval" } ] \ No newline at end of file From 45446884a114ad2eff442ef5e38beff88ba41d3b Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 14:57:17 -0500 Subject: [PATCH 27/56] add samples --- .../workarena/data_files/task_configs/go_to_page.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/go_to_page.json b/src/browsergym/workarena/data_files/task_configs/go_to_page.json index 6377031..aa6fae2 100644 --- a/src/browsergym/workarena/data_files/task_configs/go_to_page.json +++ b/src/browsergym/workarena/data_files/task_configs/go_to_page.json @@ -13,5 +13,15 @@ "page": "where installed plugins and applications are listed", "url": "/now/app-manager/home/tab/installed/sort/install_date", "goal": "Go to where installed plugins and applications are listed" + }, + { + "page": "Flow Designer", + "url": "/now/workflow-studio/home/flow", + "goal": "Go to Flow Designer" + }, + { + "page": "the page that tells you which skills different users have", + "url": "/now/nav/ui/classic/params/target/sys_user_has_skill_list.do", + "goal": "Go to the page that tells you which skills different users have" } ] \ No newline at end of file From 0c83b9c5a77d04c093d5103d178cbeb64deea3ba Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 14:35:05 -0500 Subject: [PATCH 28/56] add samples --- .../data_files/task_configs/get_number_licenses.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json b/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json index dbf06b0..f957f80 100644 --- a/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json +++ b/src/browsergym/workarena/data_files/task_configs/get_number_licenses.json @@ -13,5 +13,15 @@ "model": "Microsoft Office Home and Business 2010", "number_of_licenses": 71, "goal": "Get the number of licenses available for Microsoft Office Home and Business 2010" + }, + { + "model": "Eclipse 3.7.1", + "number_of_licenses": 1000, + "goal": "Get the number of licenses available for Eclipse 3.7.1" + }, + { + "model": "IBM Lotus Notes", + "number_of_licenses": 100000, + "goal": "Get the number of licenses available for IBM Lotus Notes" } ] \ No newline at end of file From d90ed662805f0651862adf117324b8e0b76651a1 Mon Sep 17 00:00:00 2001 From: Orlando Marquez Date: Thu, 11 Dec 2025 13:17:08 -0500 Subject: [PATCH 29/56] add transfer order tasks (not solid implementation yet) --- .../create_transfer_order_task.json | 242 ++++++++++++++++++ .../workarena/tasks/form_workspace.py | 200 ++++++++++++++- 2 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json diff --git a/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json b/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json new file mode 100644 index 0000000..669d669 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json @@ -0,0 +1,242 @@ +[ + { + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model", + "quantity_requested": "Quantity requested" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model", + "quantity_requested" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model", + "quantity_requested" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "3Com Cat 5 Cable (10ft)", + "quantity_requested": "100" + } + }, + { + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model", + "quantity_requested": "Quantity requested" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model", + "quantity_requested" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model", + "quantity_requested" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Fujitsu 1TB Hybrid Solid State Drive", + "quantity_requested": "5" + } + }, + { + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model", + "quantity_requested": "Quantity requested" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model", + "quantity_requested" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model", + "quantity_requested" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Apple iPhone 5", + "quantity_requested": "20" + } + }, + { + "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Philips Ingenuity TF PET/CT" + } + }, + { + "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Philips IntelliVue MP50" + } + }, + { + "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Philips MRC Ice X-Ray Tube" + } + }, + { + "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "Philips Respironics BiPAP Vision" + }, + "num_expected_transfer_order_lines": 3 + }, + { + "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "ACME Corporation ESG736" + }, + "num_expected_transfer_order_lines": 2 + }, + { + "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "fields": { + "from_stockroom": "From stockroom", + "to_stockroom": "To stockroom", + "model": "Model" + }, + "task_fields": [ + "from_stockroom", + "to_stockroom", + "model" + ], + "task_fields_transfer_order": [ + "from_stockroom", + "to_stockroom" + ], + "task_fields_transfer_order_line": [ + "model" + ], + "template_record": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse", + "model": "GE Healthcare iVent201" + }, + "num_expected_transfer_order_lines": 1 + } +] diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index 105b783..337adb9 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -7,6 +7,10 @@ import logging from typing import Tuple from ..api.utils import table_api_call +import re +import urllib.parse as parse +from ..utils import url_login +from typing import List class GenericCreateWorkspaceTask(GenericNewRecordTask): @@ -188,6 +192,198 @@ def __init__(self, seed: int = None, # Force starting at the homepage self.start_url = self.instance.snow_url - + + +class CreateTransferOrderTask(GenericCreateWorkspaceTask): + config_path = str( + resources.files(data_files).joinpath("task_configs/create_transfer_order_task.json") + ) + + def __init__(self, seed: int = None, + instance=None, + fixed_config: dict = None, + check_record_created=True, + **kwargs) -> None: + + GenericNewRecordTask.__init__( + self, + seed=seed, + instance=instance, + fixed_config=fixed_config, + check_record_created=check_record_created, + table_label="Transfer Order", + form_url="/now/nav/ui/classic/params/target/alm_transfer_order.do" + ) + + self.__dict__.update(kwargs) + + # Force starting at the homepage + self.start_url = self.instance.snow_url + self.created_sys_id = None + + def start(self, page: Page) -> None: + # Overriding start because calling self._get_form(page) in the parent class gives an error + logging.debug("Navigating to task start page") + + # Authenticate + url_login( + instance=self.instance, + page=page, + ) + + # Navigate to the task's url + page.goto(self.start_url) + self._wait_for_ready(page) + + def get_init_scripts(self) -> List[str]: + # Override this to avoid changing functionality of submit button + return [] + + def validate( + self, page: Page, chat_messages: list[str] + ) -> Tuple[float, bool, str, dict]: + # Attempt to get the sys id of the record being created + def extract_sys_id(url: str) -> str | None: + """ + Return the 32-hex sys_id from a ServiceNow URL, or None if not found. + Handles encoded target URLs like .../params/target/incident.do%3Fsys_id%3D + """ + # Unquote repeatedly (some SN URLs are doubly-encoded) + for _ in range(3): + new = parse.unquote(url) + if new == url: + break + url = new + + m = re.search(r"(?:[?&])sys_id=([0-9a-f]{32})", url, re.IGNORECASE) + return m.group(1) if m else None + + sys_id = extract_sys_id(page.url) + + # If we have not found a sys_id yet, or if the sys_id has changed, we consider that a new record has been created + if not self.created_sys_id or self.created_sys_id != sys_id: + self.created_sys_id = sys_id + # TODO this is not reliable as the agent could have just opened another record to view, which means we would consider it as a new record, and delete it + # Keep track of all created sysids, so we can delete them after + self.created_sysids.append(sys_id) + + if not self.created_sys_id: + return 0.0, False, "", {"message": "No record has been created or the form has not been submitted."} + else: + logging.info(f"Found sys_id {self.created_sys_id} in the URL") + + # Add the sysid to the list of created sysids + # This is used to clean up the database after the task is completed. + + # Pull the record from the database + # XXX: It's possible that the record is not found, e.g., if form submission was rejected due to client-side + # validation errors. In this case, we should not raise an error and simply consider that no record was + # created. This is non-terminal for the task. + record = table_api_call( + instance=self.instance, + table=self.table_name, + params={ + "sysparm_query": f"sys_id={self.created_sys_id}", + "sysparm_display_value": True, + }, + wait_for_record=True, + max_retries=20, # Wait up to 10 seconds + raise_on_wait_expired=False, + )["result"] + + # This can happen if the form was submitted but was rejected due to invalid inputs (e.g., missing mandatory fields) + if len(record) == 0: + logging.info( + "The record was not found in the database. Perhaps the form was not submitted correctly. " + + sys_id, + ) + return ( + 0, + False, + "", + { + "message": "The record was not found in the database. Perhaps the form was not submitted correctly." + }, + ) + + # Extract display values for reference fields + record = { + f: v if not isinstance(v, dict) else v["display_value"] for f, v in record[0].items() + } + + # We only check a subset of fields here as the rest are in another table + for f in self.config["task_fields_transfer_order"]: + if record[f].strip() != self.template_record[f].strip(): + error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{record[f].strip()}".' + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + logging.info("The transfer order record was successfully created.") + + # We have gotten the transfer order fields right. Now let's look at whether we also have the transfer order lines right + lines_record = table_api_call( + instance=self.instance, + table="alm_transfer_order_line", + params={ + "sysparm_query": f"transfer_order.sys_id={self.created_sys_id}", + "sysparm_display_value": True, + }, + wait_for_record=True, + max_retries=20, # Wait up to 10 seconds + raise_on_wait_expired=False, + )["result"] + + if len(lines_record) == 0: + error_msg = "The transfer order lines were not found in the database. We are missing some fields." + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + num_expected_transfer_order_lines = self.config.get("num_expected_transfer_order_lines", 1) + + if len(lines_record) != num_expected_transfer_order_lines: + error_msg = f"Found {len(lines_record)} transfer order lines, expected {num_expected_transfer_order_lines}." + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + # Verify expected fields in transfer order lines + for line in lines_record: + line = { + f: v if not isinstance(v, dict) else v["display_value"] for f, v in line.items() + } + + for f in self.config["task_fields_transfer_order_line"]: + if line[f].strip() != self.template_record[f].strip(): + error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{line[f].strip()}".' + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + # TODO need to delete transfer order lines also! + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully created."}, + ) + -__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask] \ No newline at end of file +__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask, CreateTransferOrderTask] \ No newline at end of file From 243ff12528714852916b8e5a40af322b81f67bd0 Mon Sep 17 00:00:00 2001 From: Orlando Marquez Date: Fri, 12 Dec 2025 11:14:55 -0500 Subject: [PATCH 30/56] add create user group tasks and refactor the validation --- .../create_transfer_order_task.json | 248 ++++++-------- .../task_configs/create_user_group_task.json | 182 ++++++++++ .../workarena/tasks/form_workspace.py | 316 ++++++++++++------ 3 files changed, 498 insertions(+), 248 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/create_user_group_task.json diff --git a/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json b/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json index 669d669..0edcd6c 100644 --- a/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json +++ b/src/browsergym/workarena/data_files/task_configs/create_transfer_order_task.json @@ -1,240 +1,210 @@ [ { - "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model", "quantity_requested": "Quantity requested" }, "task_fields": [ - "from_stockroom", - "to_stockroom", + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model", "quantity_requested" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ - "model", - "quantity_requested" - ], - "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + ], + "template_record": { + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "3Com Cat 5 Cable (10ft)", "quantity_requested": "100" } }, { - "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model", "quantity_requested": "Quantity requested" }, "task_fields": [ - "from_stockroom", - "to_stockroom", + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model", "quantity_requested" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ - "model", - "quantity_requested" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Fujitsu 1TB Hybrid Solid State Drive", "quantity_requested": "5" } }, { - "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver {quantity_requested} {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model", "quantity_requested": "Quantity requested" }, "task_fields": [ - "from_stockroom", - "to_stockroom", - "model", - "quantity_requested" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model", "quantity_requested" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Apple iPhone 5", "quantity_requested": "20" } }, { - "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver a {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ - "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Philips Ingenuity TF PET/CT" } }, { - "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver a {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", - "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Philips IntelliVue MP50" } }, { - "goal": "Create a transfer order to deliver a {model} from the {from_stockroom} to the {to_stockroom}.", + "goal": "Create a transfer order to deliver a {model} from the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}.", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", - "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Philips MRC Ice X-Ray Tube" } }, { - "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "goal": "Create a transfer order to deliver all of the {model} in the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ - "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "Philips Respironics BiPAP Vision" }, "num_expected_transfer_order_lines": 3 }, { - "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "goal": "Create a transfer order to deliver all of the {model} in the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", - "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "ACME Corporation ESG736" }, "num_expected_transfer_order_lines": 2 }, { - "goal": "Create a transfer order to deliver all of the {model} in the {from_stockroom} to the {to_stockroom}", + "goal": "Create a transfer order to deliver all of the {model} in the {transfer_order[from_stockroom]} to the {transfer_order[to_stockroom]}", "fields": { - "from_stockroom": "From stockroom", - "to_stockroom": "To stockroom", + "transfer_order.from_stockroom": "From stockroom", + "transfer_order.to_stockroom": "To stockroom", "model": "Model" }, "task_fields": [ - "from_stockroom", - "to_stockroom", - "model" - ], - "task_fields_transfer_order": [ - "from_stockroom", - "to_stockroom" - ], - "task_fields_transfer_order_line": [ + "transfer_order.from_stockroom", + "transfer_order.to_stockroom", "model" - ], + ], "template_record": { - "from_stockroom": "Southern California Warehouse", - "to_stockroom": "San Diego South Warehouse", + "transfer_order": { + "from_stockroom": "Southern California Warehouse", + "to_stockroom": "San Diego South Warehouse" + }, + "transfer_order.from_stockroom": "Southern California Warehouse", + "transfer_order.to_stockroom": "San Diego South Warehouse", "model": "GE Healthcare iVent201" }, "num_expected_transfer_order_lines": 1 diff --git a/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json b/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json new file mode 100644 index 0000000..293970c --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json @@ -0,0 +1,182 @@ +[ + { + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "fields": { + "group.name": "Name", + "group.manager": "Manager", + "group.type": "Type", + "role": "Role" + }, + "task_fields": [ + "group.name", + "group.manager", + "group.type", + "role", + "group.active" + ], + "template_record": { + "group": { + "name": "ITIL User Group", + "manager": "Pierre Salera", + "type": "itil" + }, + "group.name": "ITIL User Group", + "group.manager": "Pierre Salera", + "group.type": "itil", + "role": "itil", + "group.active": "true" + }, + "child_table": "sys_group_has_role", + "child_table_fields": "group.name, role, group.manager, group.type, group.active" + }, + { + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "fields": { + "group.name": "Name", + "group.manager": "Manager", + "group.type": "Type", + "role": "Role" + }, + "task_fields": [ + "group.name", + "group.manager", + "group.type", + "role", + "group.active" + ], + "template_record": { + "group": { + "name": "Survey Admins", + "manager": "Alene Rabeck", + "type": "survey" + }, + "group.name": "Survey Admins", + "group.manager": "Alene Rabeck", + "group.type": "survey", + "role": "survey_admin", + "group.active": "true" + }, + "child_table": "sys_group_has_role", + "child_table_fields": "group.name, role, group.manager, group.type, group.active" + }, + { + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "fields": { + "group.name": "Name", + "group.manager": "Manager", + "group.type": "Type", + "role": "Role" + }, + "task_fields": [ + "group.name", + "group.manager", + "group.type", + "role", + "group.active" + ], + "template_record": { + "group": { + "name": "Catalog Managers", + "manager": "Zachary Mockus", + "type": "catalog" + }, + "group.name": "Catalog Managers", + "group.manager": "Zachary Mockus", + "group.type": "catalog", + "role": "catalog_manager", + "group.active": "true" + }, + "child_table": "sys_group_has_role", + "child_table_fields": "group.name, role, group.manager, group.type, group.active" + }, + { + "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", + "fields": { + "group.name": "Name", + "group.description": "Description", + "user": "Members" + }, + "task_fields": [ + "group.name", + "group.description", + "group.active" + ], + "task_list_fields": [ + "user" + ], + "num_expected_child_records": 3, + "template_record": { + "group": { + "name": "NYC Coed Soccer", + "description": "We play at the Parade Grounds on Saturdays at 10", + "active": "true" + }, + "group.name": "NYC Coed Soccer", + "group.description": "We play at the Parade Grounds on Saturdays at 10", + "group.active": "true", + "user": ["Chad Araiza", "Eva Seahorn", "Floyd Veazey"] + }, + "child_table": "sys_user_grmember", + "child_table_fields": "group.name, user, group.description, group.active" + }, + { + "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", + "fields": { + "group.name": "Name", + "group.description": "Description", + "user": "Members" + }, + "task_fields": [ + "group.name", + "group.description", + "group.active" + ], + "task_list_fields": [ + "user" + ], + "num_expected_child_records": 3, + "template_record": { + "group": { + "name": "NYC Run Club", + "description": "We run Monday mornings at 7", + "active": "true" + }, + "group.name": "NYC Run Club", + "group.description": "We run Monday mornings at 7", + "group.active": "true", + "user": ["Chad Araiza", "Eva Seahorn", "Floyd Veazey"] + }, + "child_table": "sys_user_grmember", + "child_table_fields": "group.name, user, group.description, group.active" + }, + { + "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", + "fields": { + "group.name": "Name", + "group.description": "Description", + "user": "Members" + }, + "task_fields": [ + "group.name", + "group.description", + "group.active" + ], + "task_list_fields": [ + "user" + ], + "num_expected_child_records": 3, + "template_record": { + "group": { + "name": "NYC Happy Hour Group", + "description": "We get together for happy hour on Thursdays at 4", + "active": "true" + }, + "group.name": "NYC Happy Hour Group", + "group.description": "We get together for happy hour on Thursdays at 4", + "group.active": "true", + "user": ["Chad Araiza", "Eva Seahorn", "Floyd Veazey"] + }, + "child_table": "sys_user_grmember", + "child_table_fields": "group.name, user, group.description, group.active" + } +] diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index 337adb9..4a8132a 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -13,11 +13,27 @@ from typing import List +# Attempt to get the sys id of the record being created +def extract_sys_id(url: str) -> str | None: + """ + Return the 32-hex sys_id from a ServiceNow URL, or None if not found. + Handles encoded target URLs like .../params/target/incident.do%3Fsys_id%3D + """ + # Unquote repeatedly (some SN URLs are doubly-encoded) + for _ in range(3): + new = parse.unquote(url) + if new == url: + break + url = new + + m = re.search(r"(?:[?&])sys_id=([0-9a-f]{32})", url, re.IGNORECASE) + return m.group(1) if m else None + + + class GenericCreateWorkspaceTask(GenericNewRecordTask): def setup_goal(self, page: Page) -> tuple[str, dict]: - super().setup_goal(page=page) - # Get the task configuration assert self.all_configs is not None, "No configuration available for the task." config = self.fixed_config if self.fixed_config else self.random.choice(self.all_configs) @@ -242,79 +258,67 @@ def get_init_scripts(self) -> List[str]: def validate( self, page: Page, chat_messages: list[str] ) -> Tuple[float, bool, str, dict]: - # Attempt to get the sys id of the record being created - def extract_sys_id(url: str) -> str | None: - """ - Return the 32-hex sys_id from a ServiceNow URL, or None if not found. - Handles encoded target URLs like .../params/target/incident.do%3Fsys_id%3D - """ - # Unquote repeatedly (some SN URLs are doubly-encoded) - for _ in range(3): - new = parse.unquote(url) - if new == url: - break - url = new - - m = re.search(r"(?:[?&])sys_id=([0-9a-f]{32})", url, re.IGNORECASE) - return m.group(1) if m else None - - sys_id = extract_sys_id(page.url) + # We would need to be in a url such as {self.table_name}.do + if self.table_name in page.url: + sys_id = extract_sys_id(page.url) - # If we have not found a sys_id yet, or if the sys_id has changed, we consider that a new record has been created - if not self.created_sys_id or self.created_sys_id != sys_id: - self.created_sys_id = sys_id - # TODO this is not reliable as the agent could have just opened another record to view, which means we would consider it as a new record, and delete it - # Keep track of all created sysids, so we can delete them after - self.created_sysids.append(sys_id) + # If we have not found a sys_id yet, or if the sys_id has changed, we consider that a new record has been created + if not self.created_sys_id or self.created_sys_id != sys_id: + self.created_sys_id = sys_id + # TODO this is not reliable as the agent could have just opened another record to view, which means we would consider it as a new record, and delete it + # Keep track of all created sysids, so we can delete them after + self.created_sysids.append(sys_id) if not self.created_sys_id: return 0.0, False, "", {"message": "No record has been created or the form has not been submitted."} - else: - logging.info(f"Found sys_id {self.created_sys_id} in the URL") - # Add the sysid to the list of created sysids - # This is used to clean up the database after the task is completed. - - # Pull the record from the database - # XXX: It's possible that the record is not found, e.g., if form submission was rejected due to client-side - # validation errors. In this case, we should not raise an error and simply consider that no record was - # created. This is non-terminal for the task. - record = table_api_call( - instance=self.instance, - table=self.table_name, - params={ - "sysparm_query": f"sys_id={self.created_sys_id}", - "sysparm_display_value": True, - }, - wait_for_record=True, - max_retries=20, # Wait up to 10 seconds - raise_on_wait_expired=False, - )["result"] + logging.info(f"Found sys_id {self.created_sys_id} in the URL") - # This can happen if the form was submitted but was rejected due to invalid inputs (e.g., missing mandatory fields) - if len(record) == 0: - logging.info( - "The record was not found in the database. Perhaps the form was not submitted correctly. " - + sys_id, - ) - return ( + # Only look at the transfer order lines, and then dot-walk up to the transfer order + lines_record = table_api_call( + instance=self.instance, + table="alm_transfer_order_line", + params={ + "sysparm_query": f"transfer_order.sys_id={self.created_sys_id}", + "sysparm_fields": "quantity_requested, model, transfer_order.from_stockroom, transfer_order.to_stockroom", + "sysparm_display_value": True, + }, + wait_for_record=True, + max_retries=20, # Wait up to 10 seconds + raise_on_wait_expired=False, + )["result"] + + if len(lines_record) == 0: + error_msg = "The transfer order lines were not found in the database. We are missing some fields." + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + num_expected_transfer_order_lines = self.config.get("num_expected_transfer_order_lines", 1) + + if len(lines_record) != num_expected_transfer_order_lines: + error_msg = f"Found {len(lines_record)} transfer order lines, expected {num_expected_transfer_order_lines}." + logging.info(error_msg) + return ( 0, - False, - "", - { - "message": "The record was not found in the database. Perhaps the form was not submitted correctly." - }, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, ) - # Extract display values for reference fields - record = { - f: v if not isinstance(v, dict) else v["display_value"] for f, v in record[0].items() + # Verify expected fields in transfer order lines + for line in lines_record: + line = { + f: v if not isinstance(v, dict) else v["display_value"] for f, v in line.items() } - # We only check a subset of fields here as the rest are in another table - for f in self.config["task_fields_transfer_order"]: - if record[f].strip() != self.template_record[f].strip(): - error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{record[f].strip()}".' + for f in self.config["task_fields"]: + if line[f].strip() != self.template_record[f].strip(): + error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{line[f].strip()}".' logging.info(error_msg) return ( 0, @@ -323,35 +327,145 @@ def extract_sys_id(url: str) -> str | None: {"message": error_msg}, ) - logging.info("The transfer order record was successfully created.") + # TODO need to delete transfer order lines also! + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully created."}, + ) - # We have gotten the transfer order fields right. Now let's look at whether we also have the transfer order lines right - lines_record = table_api_call( - instance=self.instance, - table="alm_transfer_order_line", - params={ - "sysparm_query": f"transfer_order.sys_id={self.created_sys_id}", - "sysparm_display_value": True, - }, - wait_for_record=True, - max_retries=20, # Wait up to 10 seconds - raise_on_wait_expired=False, - )["result"] - if len(lines_record) == 0: - error_msg = "The transfer order lines were not found in the database. We are missing some fields." - logging.info(error_msg) - return ( +class CreateUserGroupTask(GenericCreateWorkspaceTask): + config_path = str( + resources.files(data_files).joinpath("task_configs/create_user_group_task.json") + ) + + def __init__(self, seed: int = None, + instance=None, + fixed_config: dict = None, + check_record_created=True, + **kwargs) -> None: + + GenericNewRecordTask.__init__( + self, + seed=seed, + instance=instance, + fixed_config=fixed_config, + check_record_created=check_record_created, + table_label="Group", + form_url="/now/nav/ui/classic/params/target/sys_user_group.do" + ) + + self.__dict__.update(kwargs) + + # Force starting at the homepage + self.start_url = self.instance.snow_url + self.created_sys_id = None + + def start(self, page: Page) -> None: + # Overriding start because calling self._get_form(page) in the parent class gives an error + logging.debug("Navigating to task start page") + + # Authenticate + url_login( + instance=self.instance, + page=page, + ) + + # Navigate to the task's url + page.goto(self.start_url) + self._wait_for_ready(page) + + def get_init_scripts(self) -> List[str]: + # Override this to avoid changing functionality of submit button + return [] + + def validate( + self, page: Page, chat_messages: list[str] + ) -> Tuple[float, bool, str, dict]: + + # We would need to be in a url such as {self.table_name}.do + if self.table_name in page.url: + sys_id = extract_sys_id(page.url) + + # If we have not found a sys_id yet, or if the sys_id has changed, we consider that a new record has been created + if not self.created_sys_id or self.created_sys_id != sys_id: + self.created_sys_id = sys_id + # TODO this is not reliable as the agent could have just opened another record to view, which means we would consider it as a new record, and delete it + # Keep track of all created sysids, so we can delete them after + self.created_sysids.append(sys_id) + + if not self.created_sys_id: + return 0.0, False, "", {"message": "No record has been created or the form has not been submitted."} + + logging.info(f"Found sys_id {self.created_sys_id} in the URL") + + # Only look at the transfer order lines, and then dot-walk up to the transfer order + child_records = table_api_call( + instance=self.instance, + table=self.config["child_table"], + params={ + "sysparm_query": f"group.sys_id={self.created_sys_id}", + "sysparm_fields": self.config["child_table_fields"], + "sysparm_display_value": True, + }, + wait_for_record=True, + max_retries=20, # Wait up to 10 seconds + raise_on_wait_expired=False, + )["result"] + + if len(child_records) == 0: + error_msg = f"The {self.config["child_table"]} records were not found in the database. We are missing some fields." + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + num_expected_child_records = self.config.get("num_expected_child_records", 1) + + if len(child_records) != num_expected_child_records: + error_msg = f"Found {len(child_records)} {self.config["child_table"]} records, expected {num_expected_child_records}." + logging.info(error_msg) + return ( 0, False, # False because we should let the agent continue trying error_msg, {"message": error_msg}, ) - num_expected_transfer_order_lines = self.config.get("num_expected_transfer_order_lines", 1) + # Use displayValue in all child records + child_records = [{f: v if not isinstance(v, dict) else v["display_value"] for f, v in child_record.items()} for child_record in child_records] + + # Verify expected fields that are common to all records + for child_record in child_records: + for f in self.config["task_fields"]: + if child_record[f].strip() != self.template_record[f].strip(): + error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{child_record[f].strip()}".' + logging.info(error_msg) + return ( + 0, + False, # False because we should let the agent continue trying + error_msg, + {"message": error_msg}, + ) + + # Now verify expected fields that are specific to each record + # Create a dictionary of expected values for each record so that we can do a set comparison + expected_values = {k: v for k, v in self.template_record.items() if k in self.config["task_list_fields"]} + # Make every value in this dictionary a set + expected_values = {k: set(e.strip() for e in v) for k, v in expected_values.items()} + + # Create a list of actual values for each record + actual_values = {k: set(record[k].strip() for record in child_records) for k in self.config["task_list_fields"]} - if len(lines_record) != num_expected_transfer_order_lines: - error_msg = f"Found {len(lines_record)} transfer order lines, expected {num_expected_transfer_order_lines}." + # Check that expected values and actual values are the same + for k, v in expected_values.items(): + if v != actual_values[k]: + error_msg = f'The field "{k}" has the wrong value. Expected: "{v}", got: "{actual_values[k]}".' logging.info(error_msg) return ( 0, @@ -360,30 +474,14 @@ def extract_sys_id(url: str) -> str | None: {"message": error_msg}, ) - # Verify expected fields in transfer order lines - for line in lines_record: - line = { - f: v if not isinstance(v, dict) else v["display_value"] for f, v in line.items() - } - - for f in self.config["task_fields_transfer_order_line"]: - if line[f].strip() != self.template_record[f].strip(): - error_msg = f'The field "{self.config["fields"][f]}" has the wrong value. Expected: "{self.template_record[f].strip()}", got: "{line[f].strip()}".' - logging.info(error_msg) - return ( - 0, - False, # False because we should let the agent continue trying - error_msg, - {"message": error_msg}, - ) - - # TODO need to delete transfer order lines also! - return ( - 1, - True, - "Nice work, thank you!", - {"message": "The record was successfully created."}, - ) + # TODO need to delete child records also! + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The record was successfully created."}, + ) + -__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask, CreateTransferOrderTask] \ No newline at end of file +__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask, CreateTransferOrderTask, CreateUserGroupTask] \ No newline at end of file From f64230c951246a638b96160ac5ff9ce183321728 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 13:15:07 -0500 Subject: [PATCH 31/56] add samples --- .../data_files/task_configs/change_ritm_status.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json b/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json index a19531e..8ae8054 100644 --- a/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json +++ b/src/browsergym/workarena/data_files/task_configs/change_ritm_status.json @@ -13,5 +13,15 @@ "ritm_number": "RITM0010003", "approval": "requested", "goal": "Change RITM0010003 approval status to requested" + }, + { + "ritm_number": "RITM0010263", + "approval": "requested", + "goal": "Change RITM0010263 approval status to requested" + }, + { + "ritm_number": "RITM0010373", + "approval": "approved", + "goal": "Change RITM0010373 approval status to approved" } ] \ No newline at end of file From 5890636cca36d62b325c661d228480f6f2ee1092 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 13:36:26 -0500 Subject: [PATCH 32/56] add samples --- .../data_files/task_configs/close_case.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/close_case.json b/src/browsergym/workarena/data_files/task_configs/close_case.json index 57a8c23..8072884 100644 --- a/src/browsergym/workarena/data_files/task_configs/close_case.json +++ b/src/browsergym/workarena/data_files/task_configs/close_case.json @@ -19,5 +19,19 @@ "resolution_code": 6, "close_notes": "Unable to sound alarm for more than one minute", "goal": "Close CS0000008, marking it as inconclusive - cannot reproduce. In the resolution notes, put \"Unable to sound alarm for more than one minute\"" + }, + { + "case_number": "CS0001401", + "resolution": "voided/canceled", + "resolution_code": 9, + "close_notes": "Customer called in, requesting we cancel the case", + "goal": "Close CS0001401, marking it as voided/canceled. In the resolution notes, put \"Customer called in, requesting we cancel the case\"" + }, + { + "case_number": "CS1000002", + "resolution": "duplicate issue", + "resolution_code": 8, + "close_notes": "Closing as duplicate issue, see CS0000501", + "goal": "Close CS1000002, marking it as duplicate issue. In the resolution notes, put \"Closing as duplicate issue, see CS0000501\"" } ] \ No newline at end of file From 4b977a7ac68ebd76df4b4cb5bc25bbaa117014c9 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 14:19:55 -0500 Subject: [PATCH 33/56] add samples --- .../data_files/task_configs/get_case_resnotes.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json b/src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json index d67f08e..09a130e 100644 --- a/src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json +++ b/src/browsergym/workarena/data_files/task_configs/get_case_resnotes.json @@ -13,5 +13,15 @@ "case_number": "CS0001004", "close_notes": "The team has applied a fix to pick all type of reports and you should no longer face this issue going forward.", "goal": "Get the resolution notes for CS0001004" + }, + { + "case_number": "CS0000002", + "close_notes": "all good now", + "goal": "Get the resolution notes for CS0000002" + }, + { + "case_number": "CS0001404", + "close_notes": "Resolved", + "goal": "Get the resolution notes for CS0001404" } ] \ No newline at end of file From fb7a94822db7f132bff283cab7cd46be266cc97f Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 13:46:45 -0500 Subject: [PATCH 34/56] add samples --- .../find_asset_under_account_create_case.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json b/src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json index 8f45a62..03ac169 100644 --- a/src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json +++ b/src/browsergym/workarena/data_files/task_configs/find_asset_under_account_create_case.json @@ -13,5 +13,15 @@ "customer_account": "Advanced Routing Components", "assets": "231W-PS-RTF - Iris 5875, 390-99IH - APC 42U 3100 SP1 NetShelter Rack", "goal": "An employee from Advanced Routing Components emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" + }, + { + "customer_account": "Vector Solutions", + "assets": "34-IUG-HHH - Dell Inc. Alienware M14x, 320-HT-982 - Asus A53 Series", + "goal": "An employee from Vector Solutions emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" + }, + { + "customer_account": "Diagonal Inc.", + "assets": "983-23872456 - ACME KNOWLYTICS, 487-2344 - ACME KX Series - KX1000", + "goal": "An employee from Diagonal Inc. emailed to report an issue with the assets on their account. Create a case for them with the names of the assets listed in the short description" } ] \ No newline at end of file From 44647428d0c1f8062cd3825c82cf0ab40e574491 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 13:41:48 -0500 Subject: [PATCH 35/56] add samples --- .../data_files/task_configs/create_interaction.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/create_interaction.json b/src/browsergym/workarena/data_files/task_configs/create_interaction.json index fb576ca..f3084f2 100644 --- a/src/browsergym/workarena/data_files/task_configs/create_interaction.json +++ b/src/browsergym/workarena/data_files/task_configs/create_interaction.json @@ -16,5 +16,17 @@ "hardware_issue": "The keyboard's vowel keys are stuck", "assigned_to": "Lacy Belmont", "goal": "A customer called in about his keyboard. The keyboard's vowel keys are stuck. Create an interaction based on the phone call and assign it to Lacy Belmont" + }, + { + "hardware": "mouse", + "hardware_issue": "The mouse is not responding", + "assigned_to": "Latoya Bryan", + "goal": "A customer called in about his mouse. The mouse is not responding. Create an interaction based on the phone call and assign it to Latoya Bryan" + }, + { + "hardware": "monitor", + "hardware_issue": "The monitor screen is cracked", + "assigned_to": "Lana Keels", + "goal": "A customer called in about his monitor. The monitor screen is cracked. Create an interaction based on the phone call and assign it to Lana Keels" } ] \ No newline at end of file From 13e7b24397e715d0dc545de9a89eae7c1e2cbac7 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 13:54:33 -0500 Subject: [PATCH 36/56] add samples --- .../task_configs/find_customer_account_manager.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json b/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json index 38f254e..6054c19 100644 --- a/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json +++ b/src/browsergym/workarena/data_files/task_configs/find_customer_account_manager.json @@ -13,5 +13,15 @@ "customer_account": "Diagonal Inc.", "contact": "Denis Koch", "goal": "Find out who the contact for Diagonal Inc. is" + }, + { + "customer_account": "Boxeo USA", + "contact": "Craig Parker", + "goal": "Find out who the contact for Boxeo USA is" + }, + { + "customer_account": "Unity System", + "contact": "Robert Turner", + "goal": "Find out who the contact for Unity System is" } ] \ No newline at end of file From 5ee7dfbf69031aa8574be0241446aaec12dc5ff8 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 14:25:02 -0500 Subject: [PATCH 37/56] add samples --- .../data_files/task_configs/get_case_status.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/get_case_status.json b/src/browsergym/workarena/data_files/task_configs/get_case_status.json index 874acee..acaf6e0 100644 --- a/src/browsergym/workarena/data_files/task_configs/get_case_status.json +++ b/src/browsergym/workarena/data_files/task_configs/get_case_status.json @@ -12,9 +12,15 @@ "goal": "Get the status of Gilly Parker's case regarding washer not starting" }, { - "consumer_name": "Heath Vazquez", - "issue": "a failed software update", - "state": "New", - "goal": "Get the status of Heath Vazquez's case regarding a failed software update" + "consumer_name": "Linda Cox", + "issue": "wireless router not working", + "state": "Awaiting Info", + "goal": "Get the status of Linda Cox's case regarding wireless router not working" + }, + { + "consumer_name": "Amy Chen", + "issue": "dashboard missing custom reports", + "state": "Resolved", + "goal": "Get the status of Amy Chen's case regarding dashboard missing custom reports" } ] \ No newline at end of file From a42bb4ec98e86b649532ce8c3d6bb220a6648cbe Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Fri, 12 Dec 2025 21:24:11 +0000 Subject: [PATCH 38/56] add deactivate_user_group json, fix bugs in service_catalog --- .../task_configs/deactivate_user_group.json | 14 +++++ .../workarena/tasks/service_catalog.py | 52 ++++++++++--------- 2 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json diff --git a/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json b/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json new file mode 100644 index 0000000..fe5f216 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json @@ -0,0 +1,14 @@ +[ + { + "name": "Survey Creators", + "goal": "Deactivate the Survey Creators group" + }, + { + "name": "Wyoming Dispatchers", + "goal": "Deactivate the Wyoming Dispatchers group" + }, + { + "name": "EMEA Escalation Approvers", + "goal": "Deactivate the EMEA Escalation Approvers group" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 088accc..a8dac33 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -713,11 +713,11 @@ class OrderIphoneTask(OrderFromServiceCatalogTask): config_path = ORDER_IPHONE_TASK_CONFIG_PATH FIELD_NAME_MAPPING = { - "Is this a replacement for a lost or broken iPhone?": "replacement", - "What was the original phone number?": "original_phone_number", - "Choose the colour": "color", - "Choose the storage": "storage", - "Monthly data allowance": "monthly_data_allowance", + "replacement": "Is this a replacement for a lost or broken iPhone?", + "original_phone_number": "What was the original phone number?", + "color": "Choose the colour", + "storage": "Choose the storage", + "monthly_data_allowance": "Monthly data allowance", } COLOR_MAPPING = { @@ -744,18 +744,18 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # go over values - if requested_item["options"][self.FIELD_NAME_MAPPING["Monthly data allowance"]] != self.config["monthly_data_allowance"]: + if requested_item["options"][self.FIELD_NAME_MAPPING["monthly_data_allowance"]] != self.config["monthly_data_allowance"]: return 0, False, "", {"message": "The requested monthly data allowance is incorrect."} - if requested_item["options"][self.FIELD_NAME_MAPPING["Is this a replacement for a lost or broken iPhone?"]] != self.config["replacement"]: + if requested_item["options"][self.FIELD_NAME_MAPPING["replacement"]] != self.config["replacement"]: return 0, False, "", {"message": "The requested replacement status is incorrect."} # TODO: add replacement phone number in data - if requested_item["options"][self.FIELD_NAME_MAPPING["What was the original phone number?"]] != self.config["original_phone_number"]: + if requested_item["options"][self.FIELD_NAME_MAPPING["original_phone_number"]] != self.config["original_phone_number"]: return 0, False, "", {"message": "The requested original phone number is incorrect."} if requested_item["options"][self.FIELD_NAME_MAPPING["color"]] != self.COLOR_MAPPING[self.config["color"]]: @@ -772,8 +772,8 @@ class OrderMobilePhoneTask(OrderFromServiceCatalogTask): config_path = ORDER_MOBILE_PHONE_TASK_CONFIG_PATH FIELD_NAME_MAPPING = { - "Choose the colour": "color", - "Choose the storage": "storage", + "color": "Choose the colour", + "storage": "Choose the storage", } COLOR_MAPPING = { @@ -792,7 +792,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # go over values @@ -817,7 +817,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} return 1, True, "", {"message": "Task completed successfully."} @@ -833,7 +833,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # NOTE: we don't check for `requested for` field. @@ -849,9 +849,9 @@ class OrderPaperSuppliesTask(OrderFromServiceCatalogTask): config_path = ORDER_PAPER_SUPPLIES_TASK_CONFIG_PATH ITEM_NAME_MAPPING = { - "Pens (box of 10)": "boxes of pens", - "Copier paper (reams)": "reams of paper", - "Screen wipes (tube of 20)": "tubes of screen wipes", + "boxes of pens": "Pens (box of 10)", + "reams of paper": "Copier paper (reams)", + "tubes of screen wipes": "Screen wipes (tube of 20)", } def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: @@ -862,13 +862,13 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # check values # we check only for 1 value. # TODO: expand to multiple items at once - if str(requested_item["options"][self.ITEM_NAME_MAPPING[self.config["item"]]]) != str(self.config["number"]): + if str(requested_item["options"][self.ITEM_NAME_MAPPING[self.config["supplies"]]]) != str(self.config["number"]): return 0, False, "", {"message": "The requested item and number is incorrect."} # NOTE: we don't look at `Additional requirements` field. @@ -956,9 +956,9 @@ class OrderPackagingAndShippingTask(OrderFromServiceCatalogTask): config_path = ORDER_PACKAGING_AND_SHIPPING_TASK_CONFIG_PATH FIELD_NAME_MAPPING = { - "Parcel details": "parcel_details", - "Shipping type": "shipping_type", - "Destination": "destination", + "parcel_details": "Parcel details", + "shipping_type": "Shipping type", + "destination": "Destination", } SHIPPING_TYPE_MAPPING = { @@ -983,13 +983,14 @@ def _get_location(self, location_sys_id: str): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) + print(requested_item) if requested_item is None: return 0, False, "", {"message": "The requested item is incorrect."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # validate values @@ -1019,7 +1020,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} return 1, True, "", {"message": "Task completed successfully."} @@ -1029,13 +1030,14 @@ class OrderSoftwareAccessTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) + print(requested_item) if requested_item is None: return 0, False, "", {"message": "The requested item is incorrect."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["quantity"] == self.config["quantity"]: + if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} # NOTE: we don't check for `requested for` field. From 4f6bd0fde92feef86c20a4b330377ef4eef9196e Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sat, 13 Dec 2025 01:17:56 +0000 Subject: [PATCH 39/56] update service catalog example and packaging data --- .../order_packaging_and_shipping.json | 10 +++---- .../workarena/tasks/service_catalog.py | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json index d391420..1222968 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json +++ b/src/browsergym/workarena/data_files/task_configs/order_packaging_and_shipping.json @@ -6,7 +6,7 @@ "parcel_details": "a box of office supplies", "parcel_keywords": "office supplies", "quantity": 1, - "goal": "I need to do a Inter-office shipment. The package ships to 10369 Democracy Lane, Fairfax,VA. The parcel contains Packaging and Shipping." + "goal": "I need to do a Inter-office shipment. The package ships to 10369 Democracy Lane, Fairfax,VA. The parcel contains a box of office supplies." }, { "item": "Packaging and Shipping", @@ -15,7 +15,7 @@ "parcel_details": "a set of high performance laptops for the team to use", "parcel_keywords": "laptop", "quantity": 1, - "goal": "I need to do a Inter-office shipment. The package ships to Hyderabad. The parcel contains Packaging and Shipping." + "goal": "I need to do a Inter-office shipment. The package ships to Hyderabad. The parcel contains a set of high performance laptops for the team to use." }, { "item": "Packaging and Shipping", @@ -24,7 +24,7 @@ "parcel_details": "a bottle of wine", "parcel_keywords": "bottle wine", "quantity": 1, - "goal": "I need to do a External Address shipment. The package ships to 7972 Pines Boulevard, Pembroke Pines,FL. The parcel contains Packaging and Shipping." + "goal": "I need to do a External Address shipment. The package ships to 7972 Pines Boulevard, Pembroke Pines,FL. The parcel contains a bottle of wine." }, { "item": "Packaging and Shipping", @@ -33,7 +33,7 @@ "parcel_details": "a couple of Brother printers", "parcel_keywords": "Brother printer", "quantity": 1, - "goal": "I need to do a External Address shipment. The package ships to SHS quadra 5, Bloco E., Brasilia. The parcel contains Packaging and Shipping." + "goal": "I need to do a External Address shipment. The package ships to SHS quadra 5, Bloco E., Brasilia. The parcel contains a couple of Brother printers." }, { "item": "Packaging and Shipping", @@ -42,6 +42,6 @@ "parcel_details": "a thank you note", "parcel_keywords": "thank you", "quantity": 1, - "goal": "I need to do a External Address shipment. The package ships to Seybold, 36 Northeast 1st Street #407, Miami,FL. The parcel contains Packaging and Shipping." + "goal": "I need to do a External Address shipment. The package ships to Seybold, 36 Northeast 1st Street #407, Miami,FL. The parcel contains a thank you note." } ] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index a8dac33..c5c9e94 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -896,8 +896,10 @@ def _get_incident_short_description(self) -> str | None: }, ) response.raise_for_status() - result = response.json().get("result", {}) - return result.get("short_description") + result = response.json().get("result", []) + if len(result) != 1: + return None + return result[0].get("short_description") def _get_incident_work_notes(self) -> dict | None: # get incident work notes @@ -914,7 +916,6 @@ def _get_incident_work_notes(self) -> dict | None: result = response.json().get("result", []) if len(result) != 1: return None - return result[0]["value"] def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: @@ -979,11 +980,12 @@ def _get_location(self, location_sys_id: str): ) response.raise_for_status() result = response.json().get("result", []) + if len(result) != 1: + return None return result[0]["name"] def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - print(requested_item) if requested_item is None: return 0, False, "", {"message": "The requested item is incorrect."} @@ -994,17 +996,22 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str return 0, False, "", {"message": "The requested quantity is incorrect."} # validate values - if not requested_item[self.FIELD_NAME_MAPPING["shipping_type"]].lower() == self.SHIPPING_TYPE_MAPPING[self.config["shipping_type"]].lower(): + if not requested_item["options"].get(self.FIELD_NAME_MAPPING["shipping_type"]).lower() == self.SHIPPING_TYPE_MAPPING[self.config["shipping_type"]].lower(): return 0, False, "", {"message": "The requested shipping type is incorrect."} # for destination, we need to do a lookup # TODO: for now we only look at the destination field, but we could also setup the postcode, city, address line 1/2, etc. - destination = self._get_location(requested_item[self.FIELD_NAME_MAPPING["destination"]]) + destination = self._get_location(requested_item["options"].get(self.FIELD_NAME_MAPPING["destination"])) + if destination is None: + return 0, False, "", {"message": "The requested destination is incorrect."} if not destination.lower() == self.config["destination"].lower(): return 0, False, "", {"message": "The requested destination is incorrect."} - for keyword in self.config["keywords"].split(" "): - if not keyword.lower() in requested_item[self.FIELD_NAME_MAPPING["parcel_details"]].lower(): + parcel_details = requested_item["options"].get(self.FIELD_NAME_MAPPING["parcel_details"]) + if parcel_details is None: + return 0, False, "", {"message": "The requested parcel details is incorrect."} + for keyword in self.config["parcel_keywords"].split(" "): + if not keyword.lower() in parcel_details.lower(): return 0, False, "", {"message": "The requested parcel details does not contain the expected keyword."} return 1, True, "", {"message": "Task completed successfully."} @@ -1030,11 +1037,11 @@ class OrderSoftwareAccessTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) - print(requested_item) if requested_item is None: return 0, False, "", {"message": "The requested item is incorrect."} - if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): + # here the `item` field is the software name, but the catalog item contains more info (e.g. `Request Dropbox account`) + if not self.config["item"].lower() in requested_item["cat_item"]["display_value"].lower(): return 0, False, "", {"message": "The requested item is incorrect."} if not requested_item["quantity"] == str(self.config["quantity"]): @@ -1043,7 +1050,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str # NOTE: we don't check for `requested for` field. # business justification - if requested_item["options"]["Business justification"] != self.config["business_justification"]: + if requested_item["options"].get("Business justification", "") != self.config["business_justification"]: return 0, False, "", {"message": "The requested business justification is incorrect."} return 1, True, "", {"message": "Task completed successfully."} From c5d9412fdd225b32b6e993c7c519a343015f6ab9 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 15:38:26 -0500 Subject: [PATCH 40/56] add samples --- .../task_configs/resolve_incident.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/resolve_incident.json b/src/browsergym/workarena/data_files/task_configs/resolve_incident.json index d39475f..e428823 100644 --- a/src/browsergym/workarena/data_files/task_configs/resolve_incident.json +++ b/src/browsergym/workarena/data_files/task_configs/resolve_incident.json @@ -22,5 +22,21 @@ "close_code": "User error", "close_notes": "User was connected to a neighbor's wifi network", "goal": "Resolve Bertie Luby's incident about performance problems with wifi. Choose \"User error\" for the resolution code and put \"User was connected to a neighbor's wifi network\" in the resolution notes" + }, + { + "incident_number": "INC0009005", + "incident_caller": "David Miller", + "issue": "email server being down", + "close_code": "Known error", + "close_notes": "Already under investigation, team is working on a fix", + "goal": "Resolve David Miller's incident about email server being down. Choose \"Known error\" for the resolution code and put \"Already under investigation, team is working on a fix\" in the resolution notes" + }, + { + "incident_number": "INC0000055", + "incident_caller": "Carol Coughlin", + "issue": "SAP sales app being unaccessible", + "close_code": "Resolved by change", + "close_notes": "Resolved this morning by change request", + "goal": "Resolve Carol Coughlin's incident about SAP sales app being unaccessible. Choose \"Resolved by change\" for the resolution code and put \"Resolved this morning by change request\" in the resolution notes" } ] \ No newline at end of file From e65d72a86058c82de54a1c29e8c23151a8755835 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 16:03:53 -0500 Subject: [PATCH 41/56] add samples --- .../task_configs/update_ritm_quantity.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json b/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json index 6f83017..690a1ac 100644 --- a/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json +++ b/src/browsergym/workarena/data_files/task_configs/update_ritm_quantity.json @@ -19,5 +19,19 @@ "stage": "department head approval", "quantity": 10, "goal": "Find the RITM for a standard laptop that's pending department head approval. Update the request to include 10 of the item instead of 1" + }, + { + "ritm_number": "RITM0010784", + "item_name": "Galaxy Note 20", + "stage": "fulfillment", + "quantity": 20, + "goal": "Find the RITM for a Galaxy Note 20 that's pending fulfillment. Update the request to include 20 of the item instead of 1" + }, + { + "ritm_number": "RITM0010003", + "item_name": "Adobe Acrobat Pro", + "stage": "approval", + "quantity": 2, + "goal": "Find the RITM for an Adobe Acrobat Pro that's pending approval. Update the request to include 2 of the item instead of 1" } ] \ No newline at end of file From 9fb663182e94539733c20480e33bf320613583c2 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 16:15:20 -0500 Subject: [PATCH 42/56] add samples --- .../data_files/task_configs/update_incident.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/update_incident.json b/src/browsergym/workarena/data_files/task_configs/update_incident.json index d05c9e1..a0852cc 100644 --- a/src/browsergym/workarena/data_files/task_configs/update_incident.json +++ b/src/browsergym/workarena/data_files/task_configs/update_incident.json @@ -16,5 +16,17 @@ "comment": "what's taking so long?", "updated_urgency": 1, "goal": "Comment on INC0000040 \"what's taking so long?\" and escalate its urgency" + }, + { + "incident_number": "INC0000039", + "comment": "does anyone have thoughts on this?", + "updated_urgency": 2, + "goal": "Comment on INC0000039 \"does anyone have thoughts on this?\" and escalate its urgency" + }, + { + "incident_number": "INC0010002", + "comment": "we need someone on this asap", + "updated_urgency": 2, + "goal": "Comment on INC0010002 \"we need someone on this asap\" and escalate its urgency" } ] \ No newline at end of file From 8b1732818cd228a4856ea2487d7f27c8d7252c71 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 16:31:36 -0500 Subject: [PATCH 43/56] add samples --- .../data_files/task_configs/deactivate_user_group.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json b/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json index fe5f216..c94f1bc 100644 --- a/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json +++ b/src/browsergym/workarena/data_files/task_configs/deactivate_user_group.json @@ -10,5 +10,13 @@ { "name": "EMEA Escalation Approvers", "goal": "Deactivate the EMEA Escalation Approvers group" + }, + { + "name": "East Qualifiers", + "goal": "Deactivate the East Qualifiers group" + }, + { + "name": "Project Mgmt", + "goal": "Deactivate the Project Mgmt group" } ] \ No newline at end of file From 6c67d98f717a7ffdcf4dbad066b0c0280c58694a Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 16:44:04 -0500 Subject: [PATCH 44/56] add samples --- .../task_configs/create_user_group_task.json | 126 +++++++++++++++++- 1 file changed, 123 insertions(+), 3 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json b/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json index 293970c..329a34e 100644 --- a/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json +++ b/src/browsergym/workarena/data_files/task_configs/create_user_group_task.json @@ -1,6 +1,6 @@ [ { - "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]} and type is {group[type]}. Assign the role {role} to the group", "fields": { "group.name": "Name", "group.manager": "Manager", @@ -30,7 +30,7 @@ "child_table_fields": "group.name, role, group.manager, group.type, group.active" }, { - "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]} and type is {group[type]}. Assign the role {role} to the group", "fields": { "group.name": "Name", "group.manager": "Manager", @@ -60,7 +60,7 @@ "child_table_fields": "group.name, role, group.manager, group.type, group.active" }, { - "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]}, type is {group[type]}, and roles include {role}", + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]} and type is {group[type]}. Assign the role {role} to the group", "fields": { "group.name": "Name", "group.manager": "Manager", @@ -89,6 +89,66 @@ "child_table": "sys_group_has_role", "child_table_fields": "group.name, role, group.manager, group.type, group.active" }, + { + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]} and type is {group[type]}. Assign the role {role} to the group", + "fields": { + "group.name": "Name", + "group.manager": "Manager", + "group.type": "Type", + "role": "Role" + }, + "task_fields": [ + "group.name", + "group.manager", + "group.type", + "role", + "group.active" + ], + "template_record": { + "group": { + "name": "WM Qualifiers", + "manager": "Keisha Ransonet", + "type": "wm_qualification" + }, + "group.name": "WM Qualifiers", + "group.manager": "Keisha Ransonet", + "group.type": "wm_qualification", + "role": "wm_qualifier", + "group.active": "true" + }, + "child_table": "sys_group_has_role", + "child_table_fields": "group.name, role, group.manager, group.type, group.active" + }, + { + "goal": "Create an active user group named '{group[name]}'. Its manager is {group[manager]} and type is {group[type]}. Assign the role {role} to the group", + "fields": { + "group.name": "Name", + "group.manager": "Manager", + "group.type": "Type", + "role": "Role" + }, + "task_fields": [ + "group.name", + "group.manager", + "group.type", + "role", + "group.active" + ], + "template_record": { + "group": { + "name": "WM Dispatchers", + "manager": "Mark Crawford", + "type": "wm_dispatch" + }, + "group.name": "WM Dispatchers", + "group.manager": "Mark Crawford", + "group.type": "wm_dispatch", + "role": "wm_dispatcher", + "group.active": "true" + }, + "child_table": "sys_group_has_role", + "child_table_fields": "group.name, role, group.manager, group.type, group.active" + }, { "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", "fields": { @@ -178,5 +238,65 @@ }, "child_table": "sys_user_grmember", "child_table_fields": "group.name, user, group.description, group.active" + }, + { + "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", + "fields": { + "group.name": "Name", + "group.description": "Description", + "user": "Members" + }, + "task_fields": [ + "group.name", + "group.description", + "group.active" + ], + "task_list_fields": [ + "user" + ], + "num_expected_child_records": 3, + "template_record": { + "group": { + "name": "NYC Yogis", + "description": "We practice yoga in Bryant Park on Tuesdays at 8", + "active": "true" + }, + "group.name": "NYC Yogis", + "group.description": "We practice yoga in Bryant Park on Tuesdays at 8", + "group.active": "true", + "user": ["Chad Araiza", "Eva Seahorn", "Floyd Veazey"] + }, + "child_table": "sys_user_grmember", + "child_table_fields": "group.name, user, group.description, group.active" + }, + { + "goal": "Create an active user group with the name '{group[name]}' and description '{group[description]}'. Add {user} to the group", + "fields": { + "group.name": "Name", + "group.description": "Description", + "user": "Members" + }, + "task_fields": [ + "group.name", + "group.description", + "group.active" + ], + "task_list_fields": [ + "user" + ], + "num_expected_child_records": 3, + "template_record": { + "group": { + "name": "NYC Cat Enthusiasts", + "description": "We volunteer at cat shelters on Sundays at 11", + "active": "true" + }, + "group.name": "NYC Cat Enthusiasts", + "group.description": "We volunteer at cat shelters on Sundays at 11", + "group.active": "true", + "user": ["Chad Araiza", "Eva Seahorn", "Floyd Veazey"] + }, + "child_table": "sys_user_grmember", + "child_table_fields": "group.name, user, group.description, group.active" } ] From 6f9d93740434074871639bcaf14aa18cc659a872 Mon Sep 17 00:00:00 2001 From: Emily Chen Date: Fri, 12 Dec 2025 17:14:59 -0500 Subject: [PATCH 45/56] add samples --- .../create_workspace_incident_task.json | 190 +++++++++++++++++- 1 file changed, 180 insertions(+), 10 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json index d895835..0e6e822 100644 --- a/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json +++ b/src/browsergym/workarena/data_files/task_configs/create_workspace_incident_task.json @@ -117,7 +117,7 @@ } }, { - "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say '{short_description}'.", "fields": { "assignment_group": "Assignment group", "business_impact": "Business impact", @@ -153,12 +153,12 @@ "caller_id": "Owen Sparacino", "urgency": "3 - Low", "category": "Inquiry / Help", - "short_description": "he can't locate the Weather Bug icon on his desktop", + "short_description": "I can't locate the Weather Bug icon on my desktop", "parent_incident": "INC0000029" } }, { - "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say '{short_description}'.", "fields": { "assignment_group": "Assignment group", "business_impact": "Business impact", @@ -194,12 +194,12 @@ "caller_id": "Genevieve Kekiwi", "urgency": "2 - Medium", "category": "Inquiry / Help", - "short_description": "she is unable to send and receive emails", - "parent_incident": "INC0000049" + "short_description": "I am unable to send and receive emails", + "parent_incident": "INC0000032" } }, { - "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say that {short_description}", + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say '{short_description}'.", "fields": { "assignment_group": "Assignment group", "business_impact": "Business impact", @@ -235,8 +235,90 @@ "caller_id": "Margot Arenburg", "urgency": "1 - High", "category": "Inquiry / Help", - "short_description": "she can't connect to Exchange", - "parent_incident": "INC0000037" + "short_description": "I can't connect to Exchange", + "parent_incident": "INC0000050" + } + }, + { + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say '{short_description}'.", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "urgency", + "category", + "short_description", + "parent_incident" + ], + "template_record": { + "caller_id": "Aaron Lee", + "urgency": "3 - Low", + "category": "Inquiry / Help", + "short_description": "I can't connect to email from my laptop", + "parent_incident": "INC0000047" + } + }, + { + "goal": "In the Service Operations workspace, create a {urgency} urgency child incident under {parent_incident}. The incident should be opened for {caller_id} under the {category} category and the short description should say '{short_description}'.", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "urgency", + "category", + "short_description", + "parent_incident" + ], + "template_record": { + "caller_id": "Crystal Lewis", + "urgency": "2 - Medium", + "category": "Inquiry / Help", + "short_description": "I need access to the common drive for file-sharing", + "parent_incident": "INC0007002" } }, { @@ -279,7 +361,7 @@ "category": "Hardware", "impact": "3 - Low", "urgency": "3 - Low", - "short_description": "His mouse is stuttering", + "short_description": "My mouse is stuttering", "watch_list": "Sharlene Circelli" } }, @@ -323,7 +405,7 @@ "category": "Network", "impact": "2 - Medium", "urgency": "2 - Medium", - "short_description": "The system is not accepting his new password", + "short_description": "The system is not accepting my new password", "watch_list": "Nathanial Phoenix" } }, @@ -370,5 +452,93 @@ "short_description": "All employee laptops in the New York office have been infected with malware", "watch_list": "Dude Lewbowskie" } + }, + { + "goal": "In the Service Operations workspace, create an incident for a {category} issue called in by {caller_id}: {short_description}. Set impact and urgency as {impact} and add {watch_list} to the watchlist", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "watch_list": "Watch list", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "category", + "impact", + "urgency", + "short_description", + "watch_list" + ], + "template_record": { + "caller_id": "Amanda Cooke", + "category": "Network", + "impact": "2 - Medium", + "urgency": "2 - Medium", + "short_description": "Network connectivity has been spotty all afternoon", + "watch_list": "John Pace" + } + }, + { + "goal": "In the Service Operations workspace, create an incident for a {category} issue called in by {caller_id}: {short_description}. Set impact and urgency as {impact} and add {watch_list} to the watchlist", + "fields": { + "assignment_group": "Assignment group", + "business_impact": "Business impact", + "business_service": "Service", + "caller_id": "Caller", + "category": "Category", + "caused_by": "Caused by Change", + "close_code": "Resolution code", + "close_notes": "Resolution notes", + "cmdb_ci": "Configuration item", + "contact_type": "Channel", + "description": "Description", + "impact": "Impact", + "knowledge": "Knowledge", + "number": "Number", + "parent_incident": "Parent Incident", + "problem_id": "Problem", + "resolved_by": "Resolved by", + "rfc": "Change Request", + "service_offering": "Service offering", + "short_description": "Short description", + "urgency": "Urgency", + "watch_list": "Watch list", + "work_notes": "Work notes" + }, + "task_fields": [ + "caller_id", + "category", + "impact", + "urgency", + "short_description", + "watch_list" + ], + "template_record": { + "caller_id": "Erik Wong", + "category": "Database", + "impact": "3 - Low", + "urgency": "3 - Low", + "short_description": "The employee database needs to be wiped of duplicate data", + "watch_list": "Mary Cruse" + } } ] \ No newline at end of file From f79b8575b887488003d14f1f69d81cc3193e0dc9 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sun, 14 Dec 2025 17:19:46 +0000 Subject: [PATCH 46/56] minor bug fixes --- src/browsergym/workarena/__init__.py | 2 ++ src/browsergym/workarena/tasks/form_workspace.py | 6 +++--- src/browsergym/workarena/tasks/role.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index cd7f642..73aa721 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -20,6 +20,7 @@ from .tasks.compositional.update_task import __TASKS__ as UPDATE_TASKS from .tasks.dashboard import __TASKS__ as DASHBOARD_TASKS from .tasks.form import __TASKS__ as FORM_TASKS +from .tasks.form_workspace import __TASKS__ as FORM_WORKSPACE_TASKS from .tasks.knowledge import __TASKS__ as KB_TASKS from .tasks.list import __TASKS__ as LIST_TASKS from .tasks.navigation import __TASKS__ as NAVIGATION_TASKS @@ -66,6 +67,7 @@ *INCIDENT_TASKS, *LICENSE_TASKS, *RITM_TASKS, + *FORM_WORKSPACE_TASKS, ] diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index 4a8132a..9665409 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -210,7 +210,7 @@ def __init__(self, seed: int = None, self.start_url = self.instance.snow_url -class CreateTransferOrderTask(GenericCreateWorkspaceTask): +class CreateWorkspaceTransferOrderTask(GenericCreateWorkspaceTask): config_path = str( resources.files(data_files).joinpath("task_configs/create_transfer_order_task.json") ) @@ -336,7 +336,7 @@ def validate( ) -class CreateUserGroupTask(GenericCreateWorkspaceTask): +class CreateWorkspaceUserGroupTask(GenericCreateWorkspaceTask): config_path = str( resources.files(data_files).joinpath("task_configs/create_user_group_task.json") ) @@ -484,4 +484,4 @@ def validate( -__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask, CreateTransferOrderTask, CreateUserGroupTask] \ No newline at end of file +__TASKS__ = [CreateWorkspaceIncidentTask, CreateWorkspaceProblemTask, CreateWorkspaceTransferOrderTask, CreateWorkspaceUserGroupTask] \ No newline at end of file diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index 7c463ec..df9700f 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -73,7 +73,7 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> params={ "sysparm_query": f"user={user_sys_id}", "sysparm_display_value": "all", - "sysparm_fields": "role", + "sysparm_fields": "sys_id,role", "sysparm_limit": 200, }, ) From f271ef82987b0d6969d020cd0710c5f493daed12 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sun, 14 Dec 2025 17:25:01 +0000 Subject: [PATCH 47/56] bug fix (double quote in fstring) --- src/browsergym/workarena/tasks/form_workspace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index 9665409..e74039b 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -416,7 +416,7 @@ def validate( )["result"] if len(child_records) == 0: - error_msg = f"The {self.config["child_table"]} records were not found in the database. We are missing some fields." + error_msg = f"The {self.config['child_table']} records were not found in the database. We are missing some fields." logging.info(error_msg) return ( 0, @@ -428,7 +428,7 @@ def validate( num_expected_child_records = self.config.get("num_expected_child_records", 1) if len(child_records) != num_expected_child_records: - error_msg = f"Found {len(child_records)} {self.config["child_table"]} records, expected {num_expected_child_records}." + error_msg = f"Found {len(child_records)} {self.config['child_table']} records, expected {num_expected_child_records}." logging.info(error_msg) return ( 0, From 712bf6a105c5261b3d18d778bcdcc59462eeb34a Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sun, 14 Dec 2025 18:23:17 +0000 Subject: [PATCH 48/56] fix logic in role tasks validation and teardown --- src/browsergym/workarena/tasks/role.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/browsergym/workarena/tasks/role.py b/src/browsergym/workarena/tasks/role.py index df9700f..4ab73f4 100644 --- a/src/browsergym/workarena/tasks/role.py +++ b/src/browsergym/workarena/tasks/role.py @@ -79,9 +79,9 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> ) response.raise_for_status() result = response.json().get("result", []) - roles = [elem["role"]["display_value"] for elem in result] + role_to_sys_id_mapping = {elem["role"]["display_value"]: elem["sys_id"] for elem in result} for role in user_roles: - if not role in roles: + if not role in role_to_sys_id_mapping: return ( 0, False, @@ -89,9 +89,7 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> {"message": "The role does not match."}, ) else: - # find which row from result is associated with that role, get sys_id, and save - sys_id = next((elem["sys_id"] for elem in result if elem["role"]["display_value"] == role), None) - self.created_sysids.append(sys_id) + self.created_sysids.append(role_to_sys_id_mapping[role]) return ( 1, True, From 54afb5d74d0e7711a8a29cab99f8044706b9aad3 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sun, 14 Dec 2025 20:26:39 +0000 Subject: [PATCH 49/56] add more task examples to assign roles tasks --- .../assign_role_to_user_admin.json | 3479 ++++++++++++++- .../assign_roles_to_user_explicit.json | 2714 ++++++++++- .../assign_roles_to_user_implicit.json | 3964 ++++++++++++++++- 3 files changed, 10135 insertions(+), 22 deletions(-) diff --git a/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json b/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json index 4df5a10..7759645 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_role_to_user_admin.json @@ -1,8 +1,3353 @@ [ + { + "user_full_name": "Credential Admin", + "roles": "admin", + "goal": "Assign Credential Admin the admin role" + }, + { + "user_full_name": "Rodrigo Wildrick", + "roles": "admin", + "goal": "Assign Rodrigo Wildrick the admin role" + }, + { + "user_full_name": "Hillary Holmes", + "roles": "admin", + "goal": "Assign Hillary Holmes the admin role" + }, + { + "user_full_name": "Dennis Millar", + "roles": "admin", + "goal": "Assign Dennis Millar the admin role" + }, + { + "user_full_name": "Kory Wooldridge", + "roles": "admin", + "goal": "Assign Kory Wooldridge the admin role" + }, + { + "user_full_name": "Savannah Loffier", + "roles": "admin", + "goal": "Assign Savannah Loffier the admin role" + }, + { + "user_full_name": "Angelique Schermerhorn", + "roles": "admin", + "goal": "Assign Angelique Schermerhorn the admin role" + }, + { + "user_full_name": "Sofia Taylor", + "roles": "admin", + "goal": "Assign Sofia Taylor the admin role" + }, + { + "user_full_name": "Conrad Lanfear", + "roles": "admin", + "goal": "Assign Conrad Lanfear the admin role" + }, + { + "user_full_name": "Manifah Masood", + "roles": "admin", + "goal": "Assign Manifah Masood the admin role" + }, + { + "user_full_name": "Fannie Steese", + "roles": "admin", + "goal": "Assign Fannie Steese the admin role" + }, + { + "user_full_name": "Travis Brockert", + "roles": "admin", + "goal": "Assign Travis Brockert the admin role" + }, + { + "user_full_name": "Beverly Cambel", + "roles": "admin", + "goal": "Assign Beverly Cambel the admin role" + }, + { + "user_full_name": "Jim Matthews", + "roles": "admin", + "goal": "Assign Jim Matthews the admin role" + }, + { + "user_full_name": "Miranda Hammitt", + "roles": "admin", + "goal": "Assign Miranda Hammitt the admin role" + }, + { + "user_full_name": "Jewel Agresta", + "roles": "admin", + "goal": "Assign Jewel Agresta the admin role" + }, + { + "user_full_name": "Candice Bruckman", + "roles": "admin", + "goal": "Assign Candice Bruckman the admin role" + }, + { + "user_full_name": "John Adams", + "roles": "admin", + "goal": "Assign John Adams the admin role" + }, + { + "user_full_name": "Bernard Laboy", + "roles": "admin", + "goal": "Assign Bernard Laboy the admin role" + }, + { + "user_full_name": "Lucius Bagnoli", + "roles": "admin", + "goal": "Assign Lucius Bagnoli the admin role" + }, + { + "user_full_name": "Robbie Deshay", + "roles": "admin", + "goal": "Assign Robbie Deshay the admin role" + }, + { + "user_full_name": "Eduardo Bellendir", + "roles": "admin", + "goal": "Assign Eduardo Bellendir the admin role" + }, + { + "user_full_name": "Bruno Nancy", + "roles": "admin", + "goal": "Assign Bruno Nancy the admin role" + }, + { + "user_full_name": "Emery Reek", + "roles": "admin", + "goal": "Assign Emery Reek the admin role" + }, + { + "user_full_name": "Danny Dales", + "roles": "admin", + "goal": "Assign Danny Dales the admin role" + }, + { + "user_full_name": "Latisha Bahls", + "roles": "admin", + "goal": "Assign Latisha Bahls the admin role" + }, + { + "user_full_name": "Eddie Gauer", + "roles": "admin", + "goal": "Assign Eddie Gauer the admin role" + }, + { + "user_full_name": "Taylor Fogerty", + "roles": "admin", + "goal": "Assign Taylor Fogerty the admin role" + }, + { + "user_full_name": "Kristine Paker", + "roles": "admin", + "goal": "Assign Kristine Paker the admin role" + }, + { + "user_full_name": "Rachel Larrison", + "roles": "admin", + "goal": "Assign Rachel Larrison the admin role" + }, + { + "user_full_name": "Naomi Caetano", + "roles": "admin", + "goal": "Assign Naomi Caetano the admin role" + }, + { + "user_full_name": "Tricia Kruss", + "roles": "admin", + "goal": "Assign Tricia Kruss the admin role" + }, + { + "user_full_name": "Trudy Worlds", + "roles": "admin", + "goal": "Assign Trudy Worlds the admin role" + }, + { + "user_full_name": "Cruz Roudabush", + "roles": "admin", + "goal": "Assign Cruz Roudabush the admin role" + }, + { + "user_full_name": "Bart Hachey", + "roles": "admin", + "goal": "Assign Bart Hachey the admin role" + }, + { + "user_full_name": "Beverley Bunche", + "roles": "admin", + "goal": "Assign Beverley Bunche the admin role" + }, + { + "user_full_name": "Natasha Ingram", + "roles": "admin", + "goal": "Assign Natasha Ingram the admin role" + }, + { + "user_full_name": "Ed Gompf", + "roles": "admin", + "goal": "Assign Ed Gompf the admin role" + }, + { + "user_full_name": "Tamara Declue", + "roles": "admin", + "goal": "Assign Tamara Declue the admin role" + }, + { + "user_full_name": "Jimmie Hardgrove", + "roles": "admin", + "goal": "Assign Jimmie Hardgrove the admin role" + }, + { + "user_full_name": "Luciano Truiolo", + "roles": "admin", + "goal": "Assign Luciano Truiolo the admin role" + }, + { + "user_full_name": "Geri Forness", + "roles": "admin", + "goal": "Assign Geri Forness the admin role" + }, + { + "user_full_name": "Edgardo Prudente", + "roles": "admin", + "goal": "Assign Edgardo Prudente the admin role" + }, + { + "user_full_name": "Eli Bettner", + "roles": "admin", + "goal": "Assign Eli Bettner the admin role" + }, + { + "user_full_name": "Robin Schartz", + "roles": "admin", + "goal": "Assign Robin Schartz the admin role" + }, + { + "user_full_name": "Password Admin", + "roles": "admin", + "goal": "Assign Password Admin the admin role" + }, + { + "user_full_name": "Tiffany Knust", + "roles": "admin", + "goal": "Assign Tiffany Knust the admin role" + }, + { + "user_full_name": "Luke Wilson", + "roles": "admin", + "goal": "Assign Luke Wilson the admin role" + }, + { + "user_full_name": "Lottie Voll", + "roles": "admin", + "goal": "Assign Lottie Voll the admin role" + }, + { + "user_full_name": "Wes Fontanella", + "roles": "admin", + "goal": "Assign Wes Fontanella the admin role" + }, + { + "user_full_name": "Virgil Chinni", + "roles": "admin", + "goal": "Assign Virgil Chinni the admin role" + }, + { + "user_full_name": "Lacy Belmont", + "roles": "admin", + "goal": "Assign Lacy Belmont the admin role" + }, + { + "user_full_name": "WM Dispatcher", + "roles": "admin", + "goal": "Assign WM Dispatcher the admin role" + }, + { + "user_full_name": "George Tukis", + "roles": "admin", + "goal": "Assign George Tukis the admin role" + }, + { + "user_full_name": "Andrew Och", + "roles": "admin", + "goal": "Assign Andrew Och the admin role" + }, + { + "user_full_name": "Nanette Turansky", + "roles": "admin", + "goal": "Assign Nanette Turansky the admin role" + }, + { + "user_full_name": "Evan Pyfrom", + "roles": "admin", + "goal": "Assign Evan Pyfrom the admin role" + }, + { + "user_full_name": "Merle Wyrosdick", + "roles": "admin", + "goal": "Assign Merle Wyrosdick the admin role" + }, + { + "user_full_name": "Roman Simone", + "roles": "admin", + "goal": "Assign Roman Simone the admin role" + }, + { + "user_full_name": "Denis Koch", + "roles": "admin", + "goal": "Assign Denis Koch the admin role" + }, + { + "user_full_name": "Annabelle Coger", + "roles": "admin", + "goal": "Assign Annabelle Coger the admin role" + }, + { + "user_full_name": "Asaf Ary", + "roles": "admin", + "goal": "Assign Asaf Ary the admin role" + }, + { + "user_full_name": "Cherie Fuhri", + "roles": "admin", + "goal": "Assign Cherie Fuhri the admin role" + }, + { + "user_full_name": "Marietta Bjornberg", + "roles": "admin", + "goal": "Assign Marietta Bjornberg the admin role" + }, + { + "user_full_name": "Oma Duffy", + "roles": "admin", + "goal": "Assign Oma Duffy the admin role" + }, + { + "user_full_name": "Gilly Parker", + "roles": "admin", + "goal": "Assign Gilly Parker the admin role" + }, + { + "user_full_name": "Password User", + "roles": "admin", + "goal": "Assign Password User the admin role" + }, + { + "user_full_name": "George Washington", + "roles": "admin", + "goal": "Assign George Washington the admin role" + }, + { + "user_full_name": "Rena Griffeth", + "roles": "admin", + "goal": "Assign Rena Griffeth the admin role" + }, + { + "user_full_name": "Krystle Stika", + "roles": "admin", + "goal": "Assign Krystle Stika the admin role" + }, + { + "user_full_name": "Antione Mccleary", + "roles": "admin", + "goal": "Assign Antione Mccleary the admin role" + }, + { + "user_full_name": "Henry Carter", + "roles": "admin", + "goal": "Assign Henry Carter the admin role" + }, + { + "user_full_name": "Melody Saddat", + "roles": "admin", + "goal": "Assign Melody Saddat the admin role" + }, + { + "user_full_name": "Tori Villaescusa", + "roles": "admin", + "goal": "Assign Tori Villaescusa the admin role" + }, + { + "user_full_name": "Suzette Devaughan", + "roles": "admin", + "goal": "Assign Suzette Devaughan the admin role" + }, + { + "user_full_name": "Anthony Roy", + "roles": "admin", + "goal": "Assign Anthony Roy the admin role" + }, + { + "user_full_name": "Christian Marnell", + "roles": "admin", + "goal": "Assign Christian Marnell the admin role" + }, + { + "user_full_name": "Pierre Salera", + "roles": "admin", + "goal": "Assign Pierre Salera the admin role" + }, + { + "user_full_name": "Judy Gartenmayer", + "roles": "admin", + "goal": "Assign Judy Gartenmayer the admin role" + }, + { + "user_full_name": "Kathleen Beresnyak", + "roles": "admin", + "goal": "Assign Kathleen Beresnyak the admin role" + }, + { + "user_full_name": "Brian Samul", + "roles": "admin", + "goal": "Assign Brian Samul the admin role" + }, + { + "user_full_name": "Henrietta Cintora", + "roles": "admin", + "goal": "Assign Henrietta Cintora the admin role" + }, + { + "user_full_name": "Lyman Whittley", + "roles": "admin", + "goal": "Assign Lyman Whittley the admin role" + }, + { + "user_full_name": "Nadia Wilshire", + "roles": "admin", + "goal": "Assign Nadia Wilshire the admin role" + }, + { + "user_full_name": "George Grey", + "roles": "admin", + "goal": "Assign George Grey the admin role" + }, + { + "user_full_name": "Gregg Guevarra", + "roles": "admin", + "goal": "Assign Gregg Guevarra the admin role" + }, + { + "user_full_name": "ECMDB Admin", + "roles": "admin", + "goal": "Assign ECMDB Admin the admin role" + }, + { + "user_full_name": "Bud Richman", + "roles": "admin", + "goal": "Assign Bud Richman the admin role" + }, + { + "user_full_name": "Johnnie Rheaves", + "roles": "admin", + "goal": "Assign Johnnie Rheaves the admin role" + }, + { + "user_full_name": "Jimmie Kertzman", + "roles": "admin", + "goal": "Assign Jimmie Kertzman the admin role" + }, + { + "user_full_name": "Reina Wolchesky", + "roles": "admin", + "goal": "Assign Reina Wolchesky the admin role" + }, + { + "user_full_name": "Garth Skiffington", + "roles": "admin", + "goal": "Assign Garth Skiffington the admin role" + }, + { + "user_full_name": "Callie Leboeuf", + "roles": "admin", + "goal": "Assign Callie Leboeuf the admin role" + }, + { + "user_full_name": "Eva Seahorn", + "roles": "admin", + "goal": "Assign Eva Seahorn the admin role" + }, + { + "user_full_name": "Antony Alldis", + "roles": "admin", + "goal": "Assign Antony Alldis the admin role" + }, + { + "user_full_name": "Thomas Pfeifer", + "roles": "admin", + "goal": "Assign Thomas Pfeifer the admin role" + }, + { + "user_full_name": "Mayme Staub", + "roles": "admin", + "goal": "Assign Mayme Staub the admin role" + }, + { + "user_full_name": "Peter Partner", + "roles": "admin", + "goal": "Assign Peter Partner the admin role" + }, + { + "user_full_name": "problem manageratf", + "roles": "admin", + "goal": "Assign problem manageratf the admin role" + }, + { + "user_full_name": "Rudy Kuhle", + "roles": "admin", + "goal": "Assign Rudy Kuhle the admin role" + }, + { + "user_full_name": "Lacy Woodfin", + "roles": "admin", + "goal": "Assign Lacy Woodfin the admin role" + }, + { + "user_full_name": "WM Approver", + "roles": "admin", + "goal": "Assign WM Approver the admin role" + }, + { + "user_full_name": "Elisa Gracely", + "roles": "admin", + "goal": "Assign Elisa Gracely the admin role" + }, + { + "user_full_name": "Tammie Schwartzwalde", + "roles": "admin", + "goal": "Assign Tammie Schwartzwalde the admin role" + }, + { + "user_full_name": "Veronica Radman", + "roles": "admin", + "goal": "Assign Veronica Radman the admin role" + }, + { + "user_full_name": "Caleb Hall", + "roles": "admin", + "goal": "Assign Caleb Hall the admin role" + }, + { + "user_full_name": "Logan Muhl", + "roles": "admin", + "goal": "Assign Logan Muhl the admin role" + }, + { + "user_full_name": "cab approver", + "roles": "admin", + "goal": "Assign cab approver the admin role" + }, + { + "user_full_name": "Ike Benthin", + "roles": "admin", + "goal": "Assign Ike Benthin the admin role" + }, + { + "user_full_name": "Becky Chan", + "roles": "admin", + "goal": "Assign Becky Chan the admin role" + }, + { + "user_full_name": "Miles Dyson", + "roles": "admin", + "goal": "Assign Miles Dyson the admin role" + }, + { + "user_full_name": "Vivian Brzostowski", + "roles": "admin", + "goal": "Assign Vivian Brzostowski the admin role" + }, + { + "user_full_name": "Joey Bolick", + "roles": "admin", + "goal": "Assign Joey Bolick the admin role" + }, + { + "user_full_name": "Judi Kivel", + "roles": "admin", + "goal": "Assign Judi Kivel the admin role" + }, + { + "user_full_name": "Terrell Rodda", + "roles": "admin", + "goal": "Assign Terrell Rodda the admin role" + }, + { + "user_full_name": "Nelly Jakuboski", + "roles": "admin", + "goal": "Assign Nelly Jakuboski the admin role" + }, + { + "user_full_name": "Sal Pindell", + "roles": "admin", + "goal": "Assign Sal Pindell the admin role" + }, + { + "user_full_name": "David Dan", + "roles": "admin", + "goal": "Assign David Dan the admin role" + }, + { + "user_full_name": "Zackary Mockus", + "roles": "admin", + "goal": "Assign Zackary Mockus the admin role" + }, + { + "user_full_name": "Junior Wadlinger", + "roles": "admin", + "goal": "Assign Junior Wadlinger the admin role" + }, + { + "user_full_name": "Armando Kolm", + "roles": "admin", + "goal": "Assign Armando Kolm the admin role" + }, + { + "user_full_name": "Baker Huges", + "roles": "admin", + "goal": "Assign Baker Huges the admin role" + }, + { + "user_full_name": "Theron Hambright", + "roles": "admin", + "goal": "Assign Theron Hambright the admin role" + }, + { + "user_full_name": "Bette Barcelona", + "roles": "admin", + "goal": "Assign Bette Barcelona the admin role" + }, + { + "user_full_name": "Alex McGibbon", + "roles": "admin", + "goal": "Assign Alex McGibbon the admin role" + }, + { + "user_full_name": "Lona Scronce", + "roles": "admin", + "goal": "Assign Lona Scronce the admin role" + }, + { + "user_full_name": "Derek Kreutzbender", + "roles": "admin", + "goal": "Assign Derek Kreutzbender the admin role" + }, + { + "user_full_name": "Josephine Sotlar", + "roles": "admin", + "goal": "Assign Josephine Sotlar the admin role" + }, + { + "user_full_name": "Julie Lewis", + "roles": "admin", + "goal": "Assign Julie Lewis the admin role" + }, + { + "user_full_name": "Marlene Hammeren", + "roles": "admin", + "goal": "Assign Marlene Hammeren the admin role" + }, + { + "user_full_name": "Jessie Barkle", + "roles": "admin", + "goal": "Assign Jessie Barkle the admin role" + }, + { + "user_full_name": "Lina Hybarger", + "roles": "admin", + "goal": "Assign Lina Hybarger the admin role" + }, + { + "user_full_name": "Daniel Smith", + "roles": "admin", + "goal": "Assign Daniel Smith the admin role" + }, + { + "user_full_name": "Emily Jason", + "roles": "admin", + "goal": "Assign Emily Jason the admin role" + }, + { + "user_full_name": "Davis Brevard", + "roles": "admin", + "goal": "Assign Davis Brevard the admin role" + }, + { + "user_full_name": "Katina Survant", + "roles": "admin", + "goal": "Assign Katina Survant the admin role" + }, + { + "user_full_name": "Nirali Patel", + "roles": "admin", + "goal": "Assign Nirali Patel the admin role" + }, + { + "user_full_name": "Ezekiel Mildon", + "roles": "admin", + "goal": "Assign Ezekiel Mildon the admin role" + }, + { + "user_full_name": "Chad Miklas", + "roles": "admin", + "goal": "Assign Chad Miklas the admin role" + }, + { + "user_full_name": "Bert Schadle", + "roles": "admin", + "goal": "Assign Bert Schadle the admin role" + }, + { + "user_full_name": "Teddy Taylor", + "roles": "admin", + "goal": "Assign Teddy Taylor the admin role" + }, + { + "user_full_name": "Cameron Richard", + "roles": "admin", + "goal": "Assign Cameron Richard the admin role" + }, + { + "user_full_name": "Marta Horner", + "roles": "admin", + "goal": "Assign Marta Horner the admin role" + }, + { + "user_full_name": "Bob Leno", + "roles": "admin", + "goal": "Assign Bob Leno the admin role" + }, + { + "user_full_name": "Beth Anglin", + "roles": "admin", + "goal": "Assign Beth Anglin the admin role" + }, + { + "user_full_name": "Rosalie Krigger", + "roles": "admin", + "goal": "Assign Rosalie Krigger the admin role" + }, + { + "user_full_name": "Ted Bozelle", + "roles": "admin", + "goal": "Assign Ted Bozelle the admin role" + }, + { + "user_full_name": "Roxie Varenhorst", + "roles": "admin", + "goal": "Assign Roxie Varenhorst the admin role" + }, + { + "user_full_name": "Charlie Brown", + "roles": "admin", + "goal": "Assign Charlie Brown the admin role" + }, + { + "user_full_name": "Linda Cox", + "roles": "admin", + "goal": "Assign Linda Cox the admin role" + }, + { + "user_full_name": "Wilfredo Gidley", + "roles": "admin", + "goal": "Assign Wilfredo Gidley the admin role" + }, + { + "user_full_name": "Guillermo Tsang", + "roles": "admin", + "goal": "Assign Guillermo Tsang the admin role" + }, + { + "user_full_name": "Jim Ranzetti", + "roles": "admin", + "goal": "Assign Jim Ranzetti the admin role" + }, + { + "user_full_name": "Ramon Amaral", + "roles": "admin", + "goal": "Assign Ramon Amaral the admin role" + }, + { + "user_full_name": "Hans Carlan", + "roles": "admin", + "goal": "Assign Hans Carlan the admin role" + }, + { + "user_full_name": "Lynda Caraway", + "roles": "admin", + "goal": "Assign Lynda Caraway the admin role" + }, + { + "user_full_name": "Melvin Auteri", + "roles": "admin", + "goal": "Assign Melvin Auteri the admin role" + }, + { + "user_full_name": "Bradly Hasselvander", + "roles": "admin", + "goal": "Assign Bradly Hasselvander the admin role" + }, + { + "user_full_name": "Tash Dubrovska", + "roles": "admin", + "goal": "Assign Tash Dubrovska the admin role" + }, + { + "user_full_name": "Security Center Data Collection User", + "roles": "admin", + "goal": "Assign Security Center Data Collection User the admin role" + }, + { + "user_full_name": "Carmella Wishman", + "roles": "admin", + "goal": "Assign Carmella Wishman the admin role" + }, + { + "user_full_name": "Kevin Edd", + "roles": "admin", + "goal": "Assign Kevin Edd the admin role" + }, + { + "user_full_name": "Annie Approver", + "roles": "admin", + "goal": "Assign Annie Approver the admin role" + }, + { + "user_full_name": "Olga Yarovenko", + "roles": "admin", + "goal": "Assign Olga Yarovenko the admin role" + }, + { + "user_full_name": "Angelo Ferentz", + "roles": "admin", + "goal": "Assign Angelo Ferentz the admin role" + }, + { + "user_full_name": "Robert Thomson", + "roles": "admin", + "goal": "Assign Robert Thomson the admin role" + }, + { + "user_full_name": "Laurie Bigg", + "roles": "admin", + "goal": "Assign Laurie Bigg the admin role" + }, + { + "user_full_name": "Sarah White", + "roles": "admin", + "goal": "Assign Sarah White the admin role" + }, + { + "user_full_name": "Brant Darnel", + "roles": "admin", + "goal": "Assign Brant Darnel the admin role" + }, + { + "user_full_name": "Rosalyn Daulton", + "roles": "admin", + "goal": "Assign Rosalyn Daulton the admin role" + }, + { + "user_full_name": "Corinne Cowan", + "roles": "admin", + "goal": "Assign Corinne Cowan the admin role" + }, + { + "user_full_name": "Mack Jurasin", + "roles": "admin", + "goal": "Assign Mack Jurasin the admin role" + }, + { + "user_full_name": "Abel Tuter", + "roles": "admin", + "goal": "Assign Abel Tuter the admin role" + }, + { + "user_full_name": "Bow Ruggeri", + "roles": "admin", + "goal": "Assign Bow Ruggeri the admin role" + }, + { + "user_full_name": "Willard Roughen", + "roles": "admin", + "goal": "Assign Willard Roughen the admin role" + }, + { + "user_full_name": "Alene Rabeck", + "roles": "admin", + "goal": "Assign Alene Rabeck the admin role" + }, + { + "user_full_name": "Eldon Sutch", + "roles": "admin", + "goal": "Assign Eldon Sutch the admin role" + }, + { + "user_full_name": "Virtual Agent", + "roles": "admin", + "goal": "Assign Virtual Agent the admin role" + }, + { + "user_full_name": "Tommy Gore", + "roles": "admin", + "goal": "Assign Tommy Gore the admin role" + }, + { + "user_full_name": "Certification Admin", + "roles": "admin", + "goal": "Assign Certification Admin the admin role" + }, + { + "user_full_name": "Aileen Mottern", + "roles": "admin", + "goal": "Assign Aileen Mottern the admin role" + }, + { + "user_full_name": "Randall Kluemper", + "roles": "admin", + "goal": "Assign Randall Kluemper the admin role" + }, + { + "user_full_name": "Kira Papen", + "roles": "admin", + "goal": "Assign Kira Papen the admin role" + }, + { + "user_full_name": "Benjamin Schkade", + "roles": "admin", + "goal": "Assign Benjamin Schkade the admin role" + }, + { + "user_full_name": "Simone Lundie", + "roles": "admin", + "goal": "Assign Simone Lundie the admin role" + }, + { + "user_full_name": "Waldo Edberg", + "roles": "admin", + "goal": "Assign Waldo Edberg the admin role" + }, + { + "user_full_name": "Kasey Nguyen", + "roles": "admin", + "goal": "Assign Kasey Nguyen the admin role" + }, + { + "user_full_name": "Teodoro Gaboury", + "roles": "admin", + "goal": "Assign Teodoro Gaboury the admin role" + }, + { + "user_full_name": "Reginald Humes", + "roles": "admin", + "goal": "Assign Reginald Humes the admin role" + }, + { + "user_full_name": "survey creator", + "roles": "admin", + "goal": "Assign survey creator the admin role" + }, + { + "user_full_name": "Mary Cruse", + "roles": "admin", + "goal": "Assign Mary Cruse the admin role" + }, + { + "user_full_name": "Sybil Marmerchant", + "roles": "admin", + "goal": "Assign Sybil Marmerchant the admin role" + }, + { + "user_full_name": "Barbara Hindley", + "roles": "admin", + "goal": "Assign Barbara Hindley the admin role" + }, + { + "user_full_name": "Brice Hedglin", + "roles": "admin", + "goal": "Assign Brice Hedglin the admin role" + }, + { + "user_full_name": "Cristina Sharper", + "roles": "admin", + "goal": "Assign Cristina Sharper the admin role" + }, + { + "user_full_name": "Don Goodliffe", + "roles": "admin", + "goal": "Assign Don Goodliffe the admin role" + }, + { + "user_full_name": "Ofelia Sheffler", + "roles": "admin", + "goal": "Assign Ofelia Sheffler the admin role" + }, + { + "user_full_name": "Dionne Borycz", + "roles": "admin", + "goal": "Assign Dionne Borycz the admin role" + }, + { + "user_full_name": "Doug Matrisciano", + "roles": "admin", + "goal": "Assign Doug Matrisciano the admin role" + }, + { + "user_full_name": "Elvira Blumenthal", + "roles": "admin", + "goal": "Assign Elvira Blumenthal the admin role" + }, + { + "user_full_name": "Freeman Soula", + "roles": "admin", + "goal": "Assign Freeman Soula the admin role" + }, + { + "user_full_name": "Denise Speegle", + "roles": "admin", + "goal": "Assign Denise Speegle the admin role" + }, + { + "user_full_name": "Paul Shafer", + "roles": "admin", + "goal": "Assign Paul Shafer the admin role" + }, + { + "user_full_name": "ESC Admin", + "roles": "admin", + "goal": "Assign ESC Admin the admin role" + }, + { + "user_full_name": "Charlie Whitherspoon", + "roles": "admin", + "goal": "Assign Charlie Whitherspoon the admin role" + }, + { + "user_full_name": "Karen Zombo", + "roles": "admin", + "goal": "Assign Karen Zombo the admin role" + }, + { + "user_full_name": "William Mahmud", + "roles": "admin", + "goal": "Assign William Mahmud the admin role" + }, + { + "user_full_name": "Delphine Helmich", + "roles": "admin", + "goal": "Assign Delphine Helmich the admin role" + }, + { + "user_full_name": "Jarvis Galas", + "roles": "admin", + "goal": "Assign Jarvis Galas the admin role" + }, + { + "user_full_name": "Jacklyn Emayo", + "roles": "admin", + "goal": "Assign Jacklyn Emayo the admin role" + }, + { + "user_full_name": "Millicent Ekstrom", + "roles": "admin", + "goal": "Assign Millicent Ekstrom the admin role" + }, + { + "user_full_name": "Daniel Kraig", + "roles": "admin", + "goal": "Assign Daniel Kraig the admin role" + }, + { + "user_full_name": "Marianne Earman", + "roles": "admin", + "goal": "Assign Marianne Earman the admin role" + }, + { + "user_full_name": "Vince Ettel", + "roles": "admin", + "goal": "Assign Vince Ettel the admin role" + }, + { + "user_full_name": "Allan Schwantd", + "roles": "admin", + "goal": "Assign Allan Schwantd the admin role" + }, + { + "user_full_name": "Ruthie Zortman", + "roles": "admin", + "goal": "Assign Ruthie Zortman the admin role" + }, + { + "user_full_name": "Boris Catino", + "roles": "admin", + "goal": "Assign Boris Catino the admin role" + }, + { + "user_full_name": "Owen Sparacino", + "roles": "admin", + "goal": "Assign Owen Sparacino the admin role" + }, + { + "user_full_name": "Brian Kiely", + "roles": "admin", + "goal": "Assign Brian Kiely the admin role" + }, + { + "user_full_name": "Floyd Veazey", + "roles": "admin", + "goal": "Assign Floyd Veazey the admin role" + }, + { + "user_full_name": "ATF Service Level Management", + "roles": "admin", + "goal": "Assign ATF Service Level Management the admin role" + }, + { + "user_full_name": "Rene Dummermuth", + "roles": "admin", + "goal": "Assign Rene Dummermuth the admin role" + }, + { + "user_full_name": "Margaret Grey", + "roles": "admin", + "goal": "Assign Margaret Grey the admin role" + }, + { + "user_full_name": "Manuel Dienhart", + "roles": "admin", + "goal": "Assign Manuel Dienhart the admin role" + }, + { + "user_full_name": "Thomas Jefferson", + "roles": "admin", + "goal": "Assign Thomas Jefferson the admin role" + }, + { + "user_full_name": "Robert Turner", + "roles": "admin", + "goal": "Assign Robert Turner the admin role" + }, + { + "user_full_name": "Keisha Ransonet", + "roles": "admin", + "goal": "Assign Keisha Ransonet the admin role" + }, + { + "user_full_name": "Alexlongnamealexlongnamealexlongname Raylongnameraylongnameraylongnameraylongname", + "roles": "admin", + "goal": "Assign Alexlongnamealexlongnamealexlongname Raylongnameraylongnameraylongnameraylongname the admin role" + }, + { + "user_full_name": "Billie Cowley", + "roles": "admin", + "goal": "Assign Billie Cowley the admin role" + }, + { + "user_full_name": "Marta Warran", + "roles": "admin", + "goal": "Assign Marta Warran the admin role" + }, + { + "user_full_name": "WM Agent", + "roles": "admin", + "goal": "Assign WM Agent the admin role" + }, + { + "user_full_name": "Karen Flierl", + "roles": "admin", + "goal": "Assign Karen Flierl the admin role" + }, + { + "user_full_name": "Edward Smith", + "roles": "admin", + "goal": "Assign Edward Smith the admin role" + }, { "user_full_name": "Allie Pumphrey", "roles": "admin", - "goal": "Assign Allie Pumphrey the admin role" + "goal": "Assign Allie Pumphrey the admin role" + }, + { + "user_full_name": "Darrin Neiss", + "roles": "admin", + "goal": "Assign Darrin Neiss the admin role" + }, + { + "user_full_name": "Bridgett Retort", + "roles": "admin", + "goal": "Assign Bridgett Retort the admin role" + }, + { + "user_full_name": "Arya Hajarha", + "roles": "admin", + "goal": "Assign Arya Hajarha the admin role" + }, + { + "user_full_name": "Lynda Youtsey", + "roles": "admin", + "goal": "Assign Lynda Youtsey the admin role" + }, + { + "user_full_name": "Mary Maurizio", + "roles": "admin", + "goal": "Assign Mary Maurizio the admin role" + }, + { + "user_full_name": "Curt Menedez", + "roles": "admin", + "goal": "Assign Curt Menedez the admin role" + }, + { + "user_full_name": "Terra Plagge", + "roles": "admin", + "goal": "Assign Terra Plagge the admin role" + }, + { + "user_full_name": "Martin Carley", + "roles": "admin", + "goal": "Assign Martin Carley the admin role" + }, + { + "user_full_name": "Deandre Resendiz", + "roles": "admin", + "goal": "Assign Deandre Resendiz the admin role" + }, + { + "user_full_name": "Chase Furler", + "roles": "admin", + "goal": "Assign Chase Furler the admin role" + }, + { + "user_full_name": "Samantha Bordwell", + "roles": "admin", + "goal": "Assign Samantha Bordwell the admin role" + }, + { + "user_full_name": "Wayne Webb", + "roles": "admin", + "goal": "Assign Wayne Webb the admin role" + }, + { + "user_full_name": "Justina Dragaj", + "roles": "admin", + "goal": "Assign Justina Dragaj the admin role" + }, + { + "user_full_name": "Daniel Zill", + "roles": "admin", + "goal": "Assign Daniel Zill the admin role" + }, + { + "user_full_name": "Bruno Smith", + "roles": "admin", + "goal": "Assign Bruno Smith the admin role" + }, + { + "user_full_name": "Lisa Ray", + "roles": "admin", + "goal": "Assign Lisa Ray the admin role" + }, + { + "user_full_name": "Felipe Mahone", + "roles": "admin", + "goal": "Assign Felipe Mahone the admin role" + }, + { + "user_full_name": "Rosemarie Fifield", + "roles": "admin", + "goal": "Assign Rosemarie Fifield the admin role" + }, + { + "user_full_name": "Wilmer Constantineau", + "roles": "admin", + "goal": "Assign Wilmer Constantineau the admin role" + }, + { + "user_full_name": "Charlie White", + "roles": "admin", + "goal": "Assign Charlie White the admin role" + }, + { + "user_full_name": "Sitemap Scheduler User ", + "roles": "admin", + "goal": "Assign Sitemap Scheduler User the admin role" + }, + { + "user_full_name": "Cary Mccamey", + "roles": "admin", + "goal": "Assign Cary Mccamey the admin role" + }, + { + "user_full_name": "Petra Clemmens", + "roles": "admin", + "goal": "Assign Petra Clemmens the admin role" + }, + { + "user_full_name": "Mandy Mcdonnell", + "roles": "admin", + "goal": "Assign Mandy Mcdonnell the admin role" + }, + { + "user_full_name": "ATF_TestItilUser1 ATF_TestItilUser1", + "roles": "admin", + "goal": "Assign ATF_TestItilUser1 ATF_TestItilUser1 the admin role" + }, + { + "user_full_name": "Sophie Langner", + "roles": "admin", + "goal": "Assign Sophie Langner the admin role" + }, + { + "user_full_name": "Marcelino Maggs", + "roles": "admin", + "goal": "Assign Marcelino Maggs the admin role" + }, + { + "user_full_name": "Guest", + "roles": "admin", + "goal": "Assign Guest the admin role" + }, + { + "user_full_name": "Meredith Ivrin", + "roles": "admin", + "goal": "Assign Meredith Ivrin the admin role" + }, + { + "user_full_name": "Howard Johnson", + "roles": "admin", + "goal": "Assign Howard Johnson the admin role" + }, + { + "user_full_name": "Tia Lino", + "roles": "admin", + "goal": "Assign Tia Lino the admin role" + }, + { + "user_full_name": "Lizzie Torregrossa", + "roles": "admin", + "goal": "Assign Lizzie Torregrossa the admin role" + }, + { + "user_full_name": "Petra Mcnichol", + "roles": "admin", + "goal": "Assign Petra Mcnichol the admin role" + }, + { + "user_full_name": "Alex Linde", + "roles": "admin", + "goal": "Assign Alex Linde the admin role" + }, + { + "user_full_name": "Mark Johnson", + "roles": "admin", + "goal": "Assign Mark Johnson the admin role" + }, + { + "user_full_name": "Ricky Tom", + "roles": "admin", + "goal": "Assign Ricky Tom the admin role" + }, + { + "user_full_name": "Darren Merlin", + "roles": "admin", + "goal": "Assign Darren Merlin the admin role" + }, + { + "user_full_name": "Jess Assad", + "roles": "admin", + "goal": "Assign Jess Assad the admin role" + }, + { + "user_full_name": "Alisa Chinoy", + "roles": "admin", + "goal": "Assign Alisa Chinoy the admin role" + }, + { + "user_full_name": "Janet Schaffter", + "roles": "admin", + "goal": "Assign Janet Schaffter the admin role" + }, + { + "user_full_name": "Denice Nordlinger", + "roles": "admin", + "goal": "Assign Denice Nordlinger the admin role" + }, + { + "user_full_name": "sharedservice.worker Agent Intelligence Plug-in", + "roles": "admin", + "goal": "Assign sharedservice.worker Agent Intelligence Plug-in the admin role" + }, + { + "user_full_name": "Emilio Lampkin", + "roles": "admin", + "goal": "Assign Emilio Lampkin the admin role" + }, + { + "user_full_name": "WM Admin", + "roles": "admin", + "goal": "Assign WM Admin the admin role" + }, + { + "user_full_name": "Diann Burigsay", + "roles": "admin", + "goal": "Assign Diann Burigsay the admin role" + }, + { + "user_full_name": "Kyle Lindauer", + "roles": "admin", + "goal": "Assign Kyle Lindauer the admin role" + }, + { + "user_full_name": "Bryan Rovell", + "roles": "admin", + "goal": "Assign Bryan Rovell the admin role" + }, + { + "user_full_name": "Lynette Setlock", + "roles": "admin", + "goal": "Assign Lynette Setlock the admin role" + }, + { + "user_full_name": "Phil Hendrie", + "roles": "admin", + "goal": "Assign Phil Hendrie the admin role" + }, + { + "user_full_name": "Marta Hoch", + "roles": "admin", + "goal": "Assign Marta Hoch the admin role" + }, + { + "user_full_name": "Taylor Vreeland", + "roles": "admin", + "goal": "Assign Taylor Vreeland the admin role" + }, + { + "user_full_name": "Lesa Chantry", + "roles": "admin", + "goal": "Assign Lesa Chantry the admin role" + }, + { + "user_full_name": "Problem Task Analyst B", + "roles": "admin", + "goal": "Assign Problem Task Analyst B the admin role" + }, + { + "user_full_name": "Felecia Riedl", + "roles": "admin", + "goal": "Assign Felecia Riedl the admin role" + }, + { + "user_full_name": "Kurtis Asberry", + "roles": "admin", + "goal": "Assign Kurtis Asberry the admin role" + }, + { + "user_full_name": "Ricky John", + "roles": "admin", + "goal": "Assign Ricky John the admin role" + }, + { + "user_full_name": "Roseann Jerko", + "roles": "admin", + "goal": "Assign Roseann Jerko the admin role" + }, + { + "user_full_name": "Donald Sherretts", + "roles": "admin", + "goal": "Assign Donald Sherretts the admin role" + }, + { + "user_full_name": "Allyson Gillispie", + "roles": "admin", + "goal": "Assign Allyson Gillispie the admin role" + }, + { + "user_full_name": "Charles Beckley", + "roles": "admin", + "goal": "Assign Charles Beckley the admin role" + }, + { + "user_full_name": "Paul Ryan", + "roles": "admin", + "goal": "Assign Paul Ryan the admin role" + }, + { + "user_full_name": "Kris Stanzak", + "roles": "admin", + "goal": "Assign Kris Stanzak the admin role" + }, + { + "user_full_name": "Reginald Lunan", + "roles": "admin", + "goal": "Assign Reginald Lunan the admin role" + }, + { + "user_full_name": "Shelley Groden", + "roles": "admin", + "goal": "Assign Shelley Groden the admin role" + }, + { + "user_full_name": "Incident Manager", + "roles": "admin", + "goal": "Assign Incident Manager the admin role" + }, + { + "user_full_name": "Gracie Ehn", + "roles": "admin", + "goal": "Assign Gracie Ehn the admin role" + }, + { + "user_full_name": "Cherie Schronce", + "roles": "admin", + "goal": "Assign Cherie Schronce the admin role" + }, + { + "user_full_name": "Neva Marsell", + "roles": "admin", + "goal": "Assign Neva Marsell the admin role" + }, + { + "user_full_name": "Antony Thierauf", + "roles": "admin", + "goal": "Assign Antony Thierauf the admin role" + }, + { + "user_full_name": "Problem Coordinator B", + "roles": "admin", + "goal": "Assign Problem Coordinator B the admin role" + }, + { + "user_full_name": "Craig Parker", + "roles": "admin", + "goal": "Assign Craig Parker the admin role" + }, + { + "user_full_name": "Chi Greenlaw", + "roles": "admin", + "goal": "Assign Chi Greenlaw the admin role" + }, + { + "user_full_name": "Jeremy Lampi", + "roles": "admin", + "goal": "Assign Jeremy Lampi the admin role" + }, + { + "user_full_name": "Elmo Gabouer", + "roles": "admin", + "goal": "Assign Elmo Gabouer the admin role" + }, + { + "user_full_name": "Benchmark Scheduler", + "roles": "admin", + "goal": "Assign Benchmark Scheduler the admin role" + }, + { + "user_full_name": "Ray William", + "roles": "admin", + "goal": "Assign Ray William the admin role" + }, + { + "user_full_name": "Charity Dyckman", + "roles": "admin", + "goal": "Assign Charity Dyckman the admin role" + }, + { + "user_full_name": "Jamie Erwin", + "roles": "admin", + "goal": "Assign Jamie Erwin the admin role" + }, + { + "user_full_name": "Lashawn Hasty", + "roles": "admin", + "goal": "Assign Lashawn Hasty the admin role" + }, + { + "user_full_name": "Barton Friesner", + "roles": "admin", + "goal": "Assign Barton Friesner the admin role" + }, + { + "user_full_name": "Amos Linnan", + "roles": "admin", + "goal": "Assign Amos Linnan the admin role" + }, + { + "user_full_name": "Celia Slavin", + "roles": "admin", + "goal": "Assign Celia Slavin the admin role" + }, + { + "user_full_name": "Delmer Delucas", + "roles": "admin", + "goal": "Assign Delmer Delucas the admin role" + }, + { + "user_full_name": "ATF_TestItilUser2 ATF_TestItilUser2", + "roles": "admin", + "goal": "Assign ATF_TestItilUser2 ATF_TestItilUser2 the admin role" + }, + { + "user_full_name": "Peggy Hohlstein", + "roles": "admin", + "goal": "Assign Peggy Hohlstein the admin role" + }, + { + "user_full_name": "Model Manager", + "roles": "admin", + "goal": "Assign Model Manager the admin role" + }, + { + "user_full_name": "Hannah Facio", + "roles": "admin", + "goal": "Assign Hannah Facio the admin role" + }, + { + "user_full_name": "User ITIL", + "roles": "admin", + "goal": "Assign User ITIL the admin role" + }, + { + "user_full_name": "Karla Ken", + "roles": "admin", + "goal": "Assign Karla Ken the admin role" + }, + { + "user_full_name": "Raphael Bickel", + "roles": "admin", + "goal": "Assign Raphael Bickel the admin role" + }, + { + "user_full_name": "SOAP Guest", + "roles": "admin", + "goal": "Assign SOAP Guest the admin role" + }, + { + "user_full_name": "Harding Asher", + "roles": "admin", + "goal": "Assign Harding Asher the admin role" + }, + { + "user_full_name": "Chris Harris", + "roles": "admin", + "goal": "Assign Chris Harris the admin role" + }, + { + "user_full_name": "Vernon Engelman", + "roles": "admin", + "goal": "Assign Vernon Engelman the admin role" + }, + { + "user_full_name": "Mildred Gallegas", + "roles": "admin", + "goal": "Assign Mildred Gallegas the admin role" + }, + { + "user_full_name": "Modesto Scroggie", + "roles": "admin", + "goal": "Assign Modesto Scroggie the admin role" + }, + { + "user_full_name": "Davis Heideman", + "roles": "admin", + "goal": "Assign Davis Heideman the admin role" + }, + { + "user_full_name": "Doreen Sakurai", + "roles": "admin", + "goal": "Assign Doreen Sakurai the admin role" + }, + { + "user_full_name": "Software Manager", + "roles": "admin", + "goal": "Assign Software Manager the admin role" + }, + { + "user_full_name": "Janet Rathrock", + "roles": "admin", + "goal": "Assign Janet Rathrock the admin role" + }, + { + "user_full_name": "Athena Fontanilla", + "roles": "admin", + "goal": "Assign Athena Fontanilla the admin role" + }, + { + "user_full_name": "Roger Rasmussen", + "roles": "admin", + "goal": "Assign Roger Rasmussen the admin role" + }, + { + "user_full_name": "Problem Manager", + "roles": "admin", + "goal": "Assign Problem Manager the admin role" + }, + { + "user_full_name": "ml.admin ", + "roles": "admin", + "goal": "Assign ml.admin the admin role" + }, + { + "user_full_name": "Mitchel Harnar", + "roles": "admin", + "goal": "Assign Mitchel Harnar the admin role" + }, + { + "user_full_name": "Ted Keppel", + "roles": "admin", + "goal": "Assign Ted Keppel the admin role" + }, + { + "user_full_name": "Jimmie Zarzycki", + "roles": "admin", + "goal": "Assign Jimmie Zarzycki the admin role" + }, + { + "user_full_name": "Caitlin Reiniger", + "roles": "admin", + "goal": "Assign Caitlin Reiniger the admin role" + }, + { + "user_full_name": "Kathie Argenti", + "roles": "admin", + "goal": "Assign Kathie Argenti the admin role" + }, + { + "user_full_name": "Val Oborne", + "roles": "admin", + "goal": "Assign Val Oborne the admin role" + }, + { + "user_full_name": "Romeo Lisac", + "roles": "admin", + "goal": "Assign Romeo Lisac the admin role" + }, + { + "user_full_name": "Jason Roy", + "roles": "admin", + "goal": "Assign Jason Roy the admin role" + }, + { + "user_full_name": "Approver User", + "roles": "admin", + "goal": "Assign Approver User the admin role" + }, + { + "user_full_name": "Davin Czukowski", + "roles": "admin", + "goal": "Assign Davin Czukowski the admin role" + }, + { + "user_full_name": "Heriberto Tivis", + "roles": "admin", + "goal": "Assign Heriberto Tivis the admin role" + }, + { + "user_full_name": "Gisela Kosicki", + "roles": "admin", + "goal": "Assign Gisela Kosicki the admin role" + }, + { + "user_full_name": "Sam Collins", + "roles": "admin", + "goal": "Assign Sam Collins the admin role" + }, + { + "user_full_name": "SLA Manager", + "roles": "admin", + "goal": "Assign SLA Manager the admin role" + }, + { + "user_full_name": "CMDB Admin", + "roles": "admin", + "goal": "Assign CMDB Admin the admin role" + }, + { + "user_full_name": "Melinda Carleton", + "roles": "admin", + "goal": "Assign Melinda Carleton the admin role" + }, + { + "user_full_name": "Ned Stark", + "roles": "admin", + "goal": "Assign Ned Stark the admin role" + }, + { + "user_full_name": "Helena Suermann", + "roles": "admin", + "goal": "Assign Helena Suermann the admin role" + }, + { + "user_full_name": "George Warren", + "roles": "admin", + "goal": "Assign George Warren the admin role" + }, + { + "user_full_name": "Prince Kauk", + "roles": "admin", + "goal": "Assign Prince Kauk the admin role" + }, + { + "user_full_name": "Leif Arguin", + "roles": "admin", + "goal": "Assign Leif Arguin the admin role" + }, + { + "user_full_name": "Robt Braithwaite", + "roles": "admin", + "goal": "Assign Robt Braithwaite the admin role" + }, + { + "user_full_name": "Leif Bachta", + "roles": "admin", + "goal": "Assign Leif Bachta the admin role" + }, + { + "user_full_name": "John Bohnhamn", + "roles": "admin", + "goal": "Assign John Bohnhamn the admin role" + }, + { + "user_full_name": "Bertram Quertermous", + "roles": "admin", + "goal": "Assign Bertram Quertermous the admin role" + }, + { + "user_full_name": "Mitch Schattner", + "roles": "admin", + "goal": "Assign Mitch Schattner the admin role" + }, + { + "user_full_name": "Warren Hacher", + "roles": "admin", + "goal": "Assign Warren Hacher the admin role" + }, + { + "user_full_name": "Hanna Cinkan", + "roles": "admin", + "goal": "Assign Hanna Cinkan the admin role" + }, + { + "user_full_name": "Marion Gaulden", + "roles": "admin", + "goal": "Assign Marion Gaulden the admin role" + }, + { + "user_full_name": "Problem CoordinatorATF", + "roles": "admin", + "goal": "Assign Problem CoordinatorATF the admin role" + }, + { + "user_full_name": "Alva Pennigton", + "roles": "admin", + "goal": "Assign Alva Pennigton the admin role" + }, + { + "user_full_name": "Byron Fortuna", + "roles": "admin", + "goal": "Assign Byron Fortuna the admin role" + }, + { + "user_full_name": "Andrew Jackson", + "roles": "admin", + "goal": "Assign Andrew Jackson the admin role" + }, + { + "user_full_name": "Gale Nolau", + "roles": "admin", + "goal": "Assign Gale Nolau the admin role" + }, + { + "user_full_name": "Robecca William", + "roles": "admin", + "goal": "Assign Robecca William the admin role" + }, + { + "user_full_name": "Jannie Bowditch", + "roles": "admin", + "goal": "Assign Jannie Bowditch the admin role" + }, + { + "user_full_name": "Nickolas Khosravi", + "roles": "admin", + "goal": "Assign Nickolas Khosravi the admin role" + }, + { + "user_full_name": "Rolando Baumann", + "roles": "admin", + "goal": "Assign Rolando Baumann the admin role" + }, + { + "user_full_name": "Certification User", + "roles": "admin", + "goal": "Assign Certification User the admin role" + }, + { + "user_full_name": "Claudio Loose", + "roles": "admin", + "goal": "Assign Claudio Loose the admin role" + }, + { + "user_full_name": "Cindy Lisa", + "roles": "admin", + "goal": "Assign Cindy Lisa the admin role" + }, + { + "user_full_name": "Florine Willardson", + "roles": "admin", + "goal": "Assign Florine Willardson the admin role" + }, + { + "user_full_name": "Lashonda Derouen", + "roles": "admin", + "goal": "Assign Lashonda Derouen the admin role" + }, + { + "user_full_name": "Van Leanen", + "roles": "admin", + "goal": "Assign Van Leanen the admin role" + }, + { + "user_full_name": "Carla Sirbaugh", + "roles": "admin", + "goal": "Assign Carla Sirbaugh the admin role" + }, + { + "user_full_name": "Genevieve Kekiwi", + "roles": "admin", + "goal": "Assign Genevieve Kekiwi the admin role" + }, + { + "user_full_name": "Bertie Luby", + "roles": "admin", + "goal": "Assign Bertie Luby the admin role" + }, + { + "user_full_name": "Willa Dutt", + "roles": "admin", + "goal": "Assign Willa Dutt the admin role" + }, + { + "user_full_name": "John Kennedy", + "roles": "admin", + "goal": "Assign John Kennedy the admin role" + }, + { + "user_full_name": "Devon Teston", + "roles": "admin", + "goal": "Assign Devon Teston the admin role" + }, + { + "user_full_name": "Darrell Amrich", + "roles": "admin", + "goal": "Assign Darrell Amrich the admin role" + }, + { + "user_full_name": "Valerie Pou", + "roles": "admin", + "goal": "Assign Valerie Pou the admin role" + }, + { + "user_full_name": "Borris Becker", + "roles": "admin", + "goal": "Assign Borris Becker the admin role" + }, + { + "user_full_name": "Dorthy Alexy", + "roles": "admin", + "goal": "Assign Dorthy Alexy the admin role" + }, + { + "user_full_name": "Audra Cantu", + "roles": "admin", + "goal": "Assign Audra Cantu the admin role" + }, + { + "user_full_name": "Amy Arquette", + "roles": "admin", + "goal": "Assign Amy Arquette the admin role" + }, + { + "user_full_name": "Felipe Gould", + "roles": "admin", + "goal": "Assign Felipe Gould the admin role" + }, + { + "user_full_name": "Sadie Rowlett", + "roles": "admin", + "goal": "Assign Sadie Rowlett the admin role" + }, + { + "user_full_name": "Alissa Mountjoy", + "roles": "admin", + "goal": "Assign Alissa Mountjoy the admin role" + }, + { + "user_full_name": "Rosanna Sandrock", + "roles": "admin", + "goal": "Assign Rosanna Sandrock the admin role" + }, + { + "user_full_name": "Walton Schwallie", + "roles": "admin", + "goal": "Assign Walton Schwallie the admin role" + }, + { + "user_full_name": "Marisa Smiler", + "roles": "admin", + "goal": "Assign Marisa Smiler the admin role" + }, + { + "user_full_name": "Valeria Lingbeek", + "roles": "admin", + "goal": "Assign Valeria Lingbeek the admin role" + }, + { + "user_full_name": "Ronald Hawes", + "roles": "admin", + "goal": "Assign Ronald Hawes the admin role" + }, + { + "user_full_name": "James Vittolo", + "roles": "admin", + "goal": "Assign James Vittolo the admin role" + }, + { + "user_full_name": "James Smith", + "roles": "admin", + "goal": "Assign James Smith the admin role" + }, + { + "user_full_name": "Garfield Lijewski", + "roles": "admin", + "goal": "Assign Garfield Lijewski the admin role" + }, + { + "user_full_name": "Vanessa Lewallen", + "roles": "admin", + "goal": "Assign Vanessa Lewallen the admin role" + }, + { + "user_full_name": "Mamie Mcintee", + "roles": "admin", + "goal": "Assign Mamie Mcintee the admin role" + }, + { + "user_full_name": "Jarrett Kenzie", + "roles": "admin", + "goal": "Assign Jarrett Kenzie the admin role" + }, + { + "user_full_name": "Norman Betance", + "roles": "admin", + "goal": "Assign Norman Betance the admin role" + }, + { + "user_full_name": "Frankie Morein", + "roles": "admin", + "goal": "Assign Frankie Morein the admin role" + }, + { + "user_full_name": "Ashley Parker", + "roles": "admin", + "goal": "Assign Ashley Parker the admin role" + }, + { + "user_full_name": "Damion Matkin", + "roles": "admin", + "goal": "Assign Damion Matkin the admin role" + }, + { + "user_full_name": "Cathryn Nicolaus", + "roles": "admin", + "goal": "Assign Cathryn Nicolaus the admin role" + }, + { + "user_full_name": "Deshawn Inafuku", + "roles": "admin", + "goal": "Assign Deshawn Inafuku the admin role" + }, + { + "user_full_name": "Reyna Bangle", + "roles": "admin", + "goal": "Assign Reyna Bangle the admin role" + }, + { + "user_full_name": "Hans Fischer", + "roles": "admin", + "goal": "Assign Hans Fischer the admin role" + }, + { + "user_full_name": "Chad Araiza", + "roles": "admin", + "goal": "Assign Chad Araiza the admin role" + }, + { + "user_full_name": "Alejandro Mascall", + "roles": "admin", + "goal": "Assign Alejandro Mascall the admin role" + }, + { + "user_full_name": "Melissa Pena", + "roles": "admin", + "goal": "Assign Melissa Pena the admin role" + }, + { + "user_full_name": "Dollie Daquino", + "roles": "admin", + "goal": "Assign Dollie Daquino the admin role" + }, + { + "user_full_name": "Roger Seid", + "roles": "admin", + "goal": "Assign Roger Seid the admin role" + }, + { + "user_full_name": "Mari Hwang", + "roles": "admin", + "goal": "Assign Mari Hwang the admin role" + }, + { + "user_full_name": "Veronica Achorn", + "roles": "admin", + "goal": "Assign Veronica Achorn the admin role" + }, + { + "user_full_name": "Diana Temple", + "roles": "admin", + "goal": "Assign Diana Temple the admin role" + }, + { + "user_full_name": "survey user", + "roles": "admin", + "goal": "Assign survey user the admin role" + }, + { + "user_full_name": "Chuck Farley", + "roles": "admin", + "goal": "Assign Chuck Farley the admin role" + }, + { + "user_full_name": "SLA Admin", + "roles": "admin", + "goal": "Assign SLA Admin the admin role" + }, + { + "user_full_name": "Quintin Isacson", + "roles": "admin", + "goal": "Assign Quintin Isacson the admin role" + }, + { + "user_full_name": "Malissa Ziesemer", + "roles": "admin", + "goal": "Assign Malissa Ziesemer the admin role" + }, + { + "user_full_name": "ATF Change Management", + "roles": "admin", + "goal": "Assign ATF Change Management the admin role" + }, + { + "user_full_name": "Tisha Gorder", + "roles": "admin", + "goal": "Assign Tisha Gorder the admin role" + }, + { + "user_full_name": "ml_report.user ", + "roles": "admin", + "goal": "Assign ml_report.user the admin role" + }, + { + "user_full_name": "Gayla Geimer", + "roles": "admin", + "goal": "Assign Gayla Geimer the admin role" + }, + { + "user_full_name": "Lora Lendor", + "roles": "admin", + "goal": "Assign Lora Lendor the admin role" + }, + { + "user_full_name": "Chuck Tomasi", + "roles": "admin", + "goal": "Assign Chuck Tomasi the admin role" + }, + { + "user_full_name": "Minh Leclare", + "roles": "admin", + "goal": "Assign Minh Leclare the admin role" + }, + { + "user_full_name": "Mitzi Ihenyen", + "roles": "admin", + "goal": "Assign Mitzi Ihenyen the admin role" + }, + { + "user_full_name": "Renae Eldrige", + "roles": "admin", + "goal": "Assign Renae Eldrige the admin role" + }, + { + "user_full_name": "Marla Folz", + "roles": "admin", + "goal": "Assign Marla Folz the admin role" + }, + { + "user_full_name": "Joe Martin", + "roles": "admin", + "goal": "Assign Joe Martin the admin role" + }, + { + "user_full_name": "Dorothea Sweem", + "roles": "admin", + "goal": "Assign Dorothea Sweem the admin role" + }, + { + "user_full_name": "David Miller", + "roles": "admin", + "goal": "Assign David Miller the admin role" + }, + { + "user_full_name": "Michelle Semmler", + "roles": "admin", + "goal": "Assign Michelle Semmler the admin role" + }, + { + "user_full_name": "John Jason", + "roles": "admin", + "goal": "Assign John Jason the admin role" + }, + { + "user_full_name": "Son Marschke", + "roles": "admin", + "goal": "Assign Son Marschke the admin role" + }, + { + "user_full_name": "Kris Persson", + "roles": "admin", + "goal": "Assign Kris Persson the admin role" + }, + { + "user_full_name": "Trey Tout", + "roles": "admin", + "goal": "Assign Trey Tout the admin role" + }, + { + "user_full_name": "Rebeca Brumet", + "roles": "admin", + "goal": "Assign Rebeca Brumet the admin role" + }, + { + "user_full_name": "Bae Kim", + "roles": "admin", + "goal": "Assign Bae Kim the admin role" + }, + { + "user_full_name": "Ross Spurger", + "roles": "admin", + "goal": "Assign Ross Spurger the admin role" + }, + { + "user_full_name": "Tyree Courrege", + "roles": "admin", + "goal": "Assign Tyree Courrege the admin role" + }, + { + "user_full_name": "Carla Humble", + "roles": "admin", + "goal": "Assign Carla Humble the admin role" + }, + { + "user_full_name": "Brandon Beckman", + "roles": "admin", + "goal": "Assign Brandon Beckman the admin role" + }, + { + "user_full_name": "Amy Chen", + "roles": "admin", + "goal": "Assign Amy Chen the admin role" + }, + { + "user_full_name": "Mellissa Sule", + "roles": "admin", + "goal": "Assign Mellissa Sule the admin role" + }, + { + "user_full_name": "Madonna Cosby", + "roles": "admin", + "goal": "Assign Madonna Cosby the admin role" + }, + { + "user_full_name": "WM Qualifier", + "roles": "admin", + "goal": "Assign WM Qualifier the admin role" + }, + { + "user_full_name": "Yvette Kokoska", + "roles": "admin", + "goal": "Assign Yvette Kokoska the admin role" + }, + { + "user_full_name": "Edward Hack", + "roles": "admin", + "goal": "Assign Edward Hack the admin role" + }, + { + "user_full_name": "Jasmin Gum", + "roles": "admin", + "goal": "Assign Jasmin Gum the admin role" + }, + { + "user_full_name": "Dwayne Maddalena", + "roles": "admin", + "goal": "Assign Dwayne Maddalena the admin role" + }, + { + "user_full_name": "Luella Pliner", + "roles": "admin", + "goal": "Assign Luella Pliner the admin role" + }, + { + "user_full_name": "boaz shamami", + "roles": "admin", + "goal": "Assign boaz shamami the admin role" + }, + { + "user_full_name": "Reina Reisenauer", + "roles": "admin", + "goal": "Assign Reina Reisenauer the admin role" + }, + { + "user_full_name": "Lana Garrigus", + "roles": "admin", + "goal": "Assign Lana Garrigus the admin role" + }, + { + "user_full_name": "Tyron Quillman", + "roles": "admin", + "goal": "Assign Tyron Quillman the admin role" + }, + { + "user_full_name": "Avery Parbol", + "roles": "admin", + "goal": "Assign Avery Parbol the admin role" + }, + { + "user_full_name": "Sam Sorokin", + "roles": "admin", + "goal": "Assign Sam Sorokin the admin role" + }, + { + "user_full_name": "Mabel Weeden", + "roles": "admin", + "goal": "Assign Mabel Weeden the admin role" + }, + { + "user_full_name": "Alfonso Griglen", + "roles": "admin", + "goal": "Assign Alfonso Griglen the admin role" + }, + { + "user_full_name": "Essie Vaill", + "roles": "admin", + "goal": "Assign Essie Vaill the admin role" + }, + { + "user_full_name": "WM InitiatorQualifier", + "roles": "admin", + "goal": "Assign WM InitiatorQualifier the admin role" + }, + { + "user_full_name": "Sheila Holloran", + "roles": "admin", + "goal": "Assign Sheila Holloran the admin role" + }, + { + "user_full_name": "Randal Gansen", + "roles": "admin", + "goal": "Assign Randal Gansen the admin role" + }, + { + "user_full_name": "Antonio Bencum", + "roles": "admin", + "goal": "Assign Antonio Bencum the admin role" + }, + { + "user_full_name": "Bess Marso", + "roles": "admin", + "goal": "Assign Bess Marso the admin role" + }, + { + "user_full_name": "Bushra Akhtar", + "roles": "admin", + "goal": "Assign Bushra Akhtar the admin role" + }, + { + "user_full_name": "Asset Manager", + "roles": "admin", + "goal": "Assign Asset Manager the admin role" + }, + { + "user_full_name": "Jude Haza", + "roles": "admin", + "goal": "Assign Jude Haza the admin role" + }, + { + "user_full_name": "Titus Rodreguez", + "roles": "admin", + "goal": "Assign Titus Rodreguez the admin role" + }, + { + "user_full_name": "Winnie Reich", + "roles": "admin", + "goal": "Assign Winnie Reich the admin role" + }, + { + "user_full_name": "Marcie Shulz", + "roles": "admin", + "goal": "Assign Marcie Shulz the admin role" + }, + { + "user_full_name": "Savannah Kesich", + "roles": "admin", + "goal": "Assign Savannah Kesich the admin role" + }, + { + "user_full_name": "Maryann Garnette", + "roles": "admin", + "goal": "Assign Maryann Garnette the admin role" + }, + { + "user_full_name": "Karyn Jinks", + "roles": "admin", + "goal": "Assign Karyn Jinks the admin role" + }, + { + "user_full_name": "Marcelo Arostegui", + "roles": "admin", + "goal": "Assign Marcelo Arostegui the admin role" + }, + { + "user_full_name": "Colin Altonen", + "roles": "admin", + "goal": "Assign Colin Altonen the admin role" + }, + { + "user_full_name": "Sabrina Deppert", + "roles": "admin", + "goal": "Assign Sabrina Deppert the admin role" + }, + { + "user_full_name": "Tommie Reuland", + "roles": "admin", + "goal": "Assign Tommie Reuland the admin role" + }, + { + "user_full_name": "Joel Nardo", + "roles": "admin", + "goal": "Assign Joel Nardo the admin role" + }, + { + "user_full_name": "Edwin Lavelli", + "roles": "admin", + "goal": "Assign Edwin Lavelli the admin role" + }, + { + "user_full_name": "ITIL User", + "roles": "admin", + "goal": "Assign ITIL User the admin role" + }, + { + "user_full_name": "Buster Wubbel", + "roles": "admin", + "goal": "Assign Buster Wubbel the admin role" + }, + { + "user_full_name": "Stacey Blow", + "roles": "admin", + "goal": "Assign Stacey Blow the admin role" + }, + { + "user_full_name": "Neil Backus", + "roles": "admin", + "goal": "Assign Neil Backus the admin role" + }, + { + "user_full_name": "Andrew Chen", + "roles": "admin", + "goal": "Assign Andrew Chen the admin role" + }, + { + "user_full_name": "Cindy Contact", + "roles": "admin", + "goal": "Assign Cindy Contact the admin role" + }, + { + "user_full_name": "Rosalind Krenzke", + "roles": "admin", + "goal": "Assign Rosalind Krenzke the admin role" + }, + { + "user_full_name": "Cristopher Wiget", + "roles": "admin", + "goal": "Assign Cristopher Wiget the admin role" + }, + { + "user_full_name": "Isiah Phernetton", + "roles": "admin", + "goal": "Assign Isiah Phernetton the admin role" + }, + { + "user_full_name": "Lane Brantz", + "roles": "admin", + "goal": "Assign Lane Brantz the admin role" + }, + { + "user_full_name": "Pat Hoshaw", + "roles": "admin", + "goal": "Assign Pat Hoshaw the admin role" + }, + { + "user_full_name": "Viola Mcsorley", + "roles": "admin", + "goal": "Assign Viola Mcsorley the admin role" + }, + { + "user_full_name": "Rubin Crotts", + "roles": "admin", + "goal": "Assign Rubin Crotts the admin role" + }, + { + "user_full_name": "Miquel Demicco", + "roles": "admin", + "goal": "Assign Miquel Demicco the admin role" + }, + { + "user_full_name": "Ashley Leonesio", + "roles": "admin", + "goal": "Assign Ashley Leonesio the admin role" + }, + { + "user_full_name": "Maynard Kaewprasert", + "roles": "admin", + "goal": "Assign Maynard Kaewprasert the admin role" + }, + { + "user_full_name": "Dwain Cuttitta", + "roles": "admin", + "goal": "Assign Dwain Cuttitta the admin role" + }, + { + "user_full_name": "Abraham Lincoln", + "roles": "admin", + "goal": "Assign Abraham Lincoln the admin role" + }, + { + "user_full_name": "Christa Bodenschatz", + "roles": "admin", + "goal": "Assign Christa Bodenschatz the admin role" + }, + { + "user_full_name": "Sherwood Detillier", + "roles": "admin", + "goal": "Assign Sherwood Detillier the admin role" + }, + { + "user_full_name": "Hilario Cassa", + "roles": "admin", + "goal": "Assign Hilario Cassa the admin role" + }, + { + "user_full_name": "Joey Sedore", + "roles": "admin", + "goal": "Assign Joey Sedore the admin role" + }, + { + "user_full_name": "Jacinto Gawron", + "roles": "admin", + "goal": "Assign Jacinto Gawron the admin role" + }, + { + "user_full_name": "Ray Srock", + "roles": "admin", + "goal": "Assign Ray Srock the admin role" + }, + { + "user_full_name": "Brent Vaidya", + "roles": "admin", + "goal": "Assign Brent Vaidya the admin role" + }, + { + "user_full_name": "Dollie Pillitteri", + "roles": "admin", + "goal": "Assign Dollie Pillitteri the admin role" + }, + { + "user_full_name": "Kylie Bridgeman", + "roles": "admin", + "goal": "Assign Kylie Bridgeman the admin role" + }, + { + "user_full_name": "Julius Reyes", + "roles": "admin", + "goal": "Assign Julius Reyes the admin role" + }, + { + "user_full_name": "Georgette Bandyk", + "roles": "admin", + "goal": "Assign Georgette Bandyk the admin role" + }, + { + "user_full_name": "Coleman Cuneo", + "roles": "admin", + "goal": "Assign Coleman Cuneo the admin role" + }, + { + "user_full_name": "Marshall Hutch", + "roles": "admin", + "goal": "Assign Marshall Hutch the admin role" + }, + { + "user_full_name": "Inventory Admin", + "roles": "admin", + "goal": "Assign Inventory Admin the admin role" + }, + { + "user_full_name": "Deanna Gerbi", + "roles": "admin", + "goal": "Assign Deanna Gerbi the admin role" + }, + { + "user_full_name": "Darrel Ruffins", + "roles": "admin", + "goal": "Assign Darrel Ruffins the admin role" + }, + { + "user_full_name": "Germaine Bruski", + "roles": "admin", + "goal": "Assign Germaine Bruski the admin role" + }, + { + "user_full_name": "Problem Coordinator A", + "roles": "admin", + "goal": "Assign Problem Coordinator A the admin role" + }, + { + "user_full_name": "Marscha Gilles-Piecukonis", + "roles": "admin", + "goal": "Assign Marscha Gilles-Piecukonis the admin role" + }, + { + "user_full_name": "Vernice Resendes", + "roles": "admin", + "goal": "Assign Vernice Resendes the admin role" + }, + { + "user_full_name": "Fran Zanders", + "roles": "admin", + "goal": "Assign Fran Zanders the admin role" + }, + { + "user_full_name": "ATF User", + "roles": "admin", + "goal": "Assign ATF User the admin role" + }, + { + "user_full_name": "Enrique Oroark", + "roles": "admin", + "goal": "Assign Enrique Oroark the admin role" + }, + { + "user_full_name": "Emilia Oxley", + "roles": "admin", + "goal": "Assign Emilia Oxley the admin role" + }, + { + "user_full_name": "Eliseo Wice", + "roles": "admin", + "goal": "Assign Eliseo Wice the admin role" + }, + { + "user_full_name": "Patty Bernasconi", + "roles": "admin", + "goal": "Assign Patty Bernasconi the admin role" + }, + { + "user_full_name": "Sandra Graen", + "roles": "admin", + "goal": "Assign Sandra Graen the admin role" + }, + { + "user_full_name": "Teri Erlewine", + "roles": "admin", + "goal": "Assign Teri Erlewine the admin role" + }, + { + "user_full_name": "Alejandra Prenatt", + "roles": "admin", + "goal": "Assign Alejandra Prenatt the admin role" + }, + { + "user_full_name": "Tia Neumaier", + "roles": "admin", + "goal": "Assign Tia Neumaier the admin role" + }, + { + "user_full_name": "Robyn Christophel", + "roles": "admin", + "goal": "Assign Robyn Christophel the admin role" + }, + { + "user_full_name": "Zane Sulikowski", + "roles": "admin", + "goal": "Assign Zane Sulikowski the admin role" + }, + { + "user_full_name": "Pamala Brodtmann", + "roles": "admin", + "goal": "Assign Pamala Brodtmann the admin role" + }, + { + "user_full_name": "Dwain Agricola", + "roles": "admin", + "goal": "Assign Dwain Agricola the admin role" + }, + { + "user_full_name": "Kerry Evertt", + "roles": "admin", + "goal": "Assign Kerry Evertt the admin role" + }, + { + "user_full_name": "Armando Papik", + "roles": "admin", + "goal": "Assign Armando Papik the admin role" + }, + { + "user_full_name": "Bridget Knightly", + "roles": "admin", + "goal": "Assign Bridget Knightly the admin role" + }, + { + "user_full_name": "Heath Vazquez", + "roles": "admin", + "goal": "Assign Heath Vazquez the admin role" + }, + { + "user_full_name": "Marc Wanger", + "roles": "admin", + "goal": "Assign Marc Wanger the admin role" + }, + { + "user_full_name": "Crissy Stark", + "roles": "admin", + "goal": "Assign Crissy Stark the admin role" + }, + { + "user_full_name": "Laurie Bibbs", + "roles": "admin", + "goal": "Assign Laurie Bibbs the admin role" + }, + { + "user_full_name": "Valentine Granberry", + "roles": "admin", + "goal": "Assign Valentine Granberry the admin role" + }, + { + "user_full_name": "Isaac Davensizer", + "roles": "admin", + "goal": "Assign Isaac Davensizer the admin role" + }, + { + "user_full_name": "Waldo Sisk", + "roles": "admin", + "goal": "Assign Waldo Sisk the admin role" + }, + { + "user_full_name": "Isabell Armout", + "roles": "admin", + "goal": "Assign Isabell Armout the admin role" + }, + { + "user_full_name": "Clarice Knower", + "roles": "admin", + "goal": "Assign Clarice Knower the admin role" + }, + { + "user_full_name": "Mara Rineheart", + "roles": "admin", + "goal": "Assign Mara Rineheart the admin role" + }, + { + "user_full_name": "Misty Ericksen", + "roles": "admin", + "goal": "Assign Misty Ericksen the admin role" + }, + { + "user_full_name": "Isaac Zackery", + "roles": "admin", + "goal": "Assign Isaac Zackery the admin role" + }, + { + "user_full_name": "Kira Staffon", + "roles": "admin", + "goal": "Assign Kira Staffon the admin role" + }, + { + "user_full_name": "Reggie Streu", + "roles": "admin", + "goal": "Assign Reggie Streu the admin role" + }, + { + "user_full_name": "Steve Schorr", + "roles": "admin", + "goal": "Assign Steve Schorr the admin role" + }, + { + "user_full_name": "Jimmie Barninger", + "roles": "admin", + "goal": "Assign Jimmie Barninger the admin role" + }, + { + "user_full_name": "Jonathon Waldall", + "roles": "admin", + "goal": "Assign Jonathon Waldall the admin role" + }, + { + "user_full_name": "Lee Javens", + "roles": "admin", + "goal": "Assign Lee Javens the admin role" + }, + { + "user_full_name": "Erica Eyrich", + "roles": "admin", + "goal": "Assign Erica Eyrich the admin role" + }, + { + "user_full_name": "Maryjane Arata", + "roles": "admin", + "goal": "Assign Maryjane Arata the admin role" + }, + { + "user_full_name": "Alex Ray", + "roles": "admin", + "goal": "Assign Alex Ray the admin role" + }, + { + "user_full_name": "Katina Ramano", + "roles": "admin", + "goal": "Assign Katina Ramano the admin role" + }, + { + "user_full_name": "Margot Arenburg", + "roles": "admin", + "goal": "Assign Margot Arenburg the admin role" + }, + { + "user_full_name": "Pilar Suddeth", + "roles": "admin", + "goal": "Assign Pilar Suddeth the admin role" + }, + { + "user_full_name": "Lana Keels", + "roles": "admin", + "goal": "Assign Lana Keels the admin role" + }, + { + "user_full_name": "Naomi Greenly", + "roles": "admin", + "goal": "Assign Naomi Greenly the admin role" + }, + { + "user_full_name": "Elmo Dagenais", + "roles": "admin", + "goal": "Assign Elmo Dagenais the admin role" + }, + { + "user_full_name": "Maryanne Whyman", + "roles": "admin", + "goal": "Assign Maryanne Whyman the admin role" + }, + { + "user_full_name": "Mathew Taylor", + "roles": "admin", + "goal": "Assign Mathew Taylor the admin role" + }, + { + "user_full_name": "Leslie Cackowski", + "roles": "admin", + "goal": "Assign Leslie Cackowski the admin role" + }, + { + "user_full_name": "Traci Toomey", + "roles": "admin", + "goal": "Assign Traci Toomey the admin role" + }, + { + "user_full_name": "Shanna Numkena", + "roles": "admin", + "goal": "Assign Shanna Numkena the admin role" + }, + { + "user_full_name": "Faiza Ramos", + "roles": "admin", + "goal": "Assign Faiza Ramos the admin role" + }, + { + "user_full_name": "Arron Ubhi", + "roles": "admin", + "goal": "Assign Arron Ubhi the admin role" + }, + { + "user_full_name": "Change Manager", + "roles": "admin", + "goal": "Assign Change Manager the admin role" + }, + { + "user_full_name": "Rebekah Padley", + "roles": "admin", + "goal": "Assign Rebekah Padley the admin role" + }, + { + "user_full_name": "Rich Gleave", + "roles": "admin", + "goal": "Assign Rich Gleave the admin role" + }, + { + "user_full_name": "Timothy Janski", + "roles": "admin", + "goal": "Assign Timothy Janski the admin role" + }, + { + "user_full_name": "Amy Pascal", + "roles": "admin", + "goal": "Assign Amy Pascal the admin role" + }, + { + "user_full_name": "Lashonda Enote", + "roles": "admin", + "goal": "Assign Lashonda Enote the admin role" + }, + { + "user_full_name": "Socorro Balandran", + "roles": "admin", + "goal": "Assign Socorro Balandran the admin role" + }, + { + "user_full_name": "Carolina Kinlaw", + "roles": "admin", + "goal": "Assign Carolina Kinlaw the admin role" + }, + { + "user_full_name": "Robin Grotz", + "roles": "admin", + "goal": "Assign Robin Grotz the admin role" + }, + { + "user_full_name": "Kennith Kirklin", + "roles": "admin", + "goal": "Assign Kennith Kirklin the admin role" + }, + { + "user_full_name": "Milton Kuhlman", + "roles": "admin", + "goal": "Assign Milton Kuhlman the admin role" + }, + { + "user_full_name": "Warren Speach", + "roles": "admin", + "goal": "Assign Warren Speach the admin role" + }, + { + "user_full_name": "Terrance Nimmer", + "roles": "admin", + "goal": "Assign Terrance Nimmer the admin role" + }, + { + "user_full_name": "Reva Lecates", + "roles": "admin", + "goal": "Assign Reva Lecates the admin role" + }, + { + "user_full_name": "Jeri Farstvedt", + "roles": "admin", + "goal": "Assign Jeri Farstvedt the admin role" + }, + { + "user_full_name": "Brian Duke", + "roles": "admin", + "goal": "Assign Brian Duke the admin role" + }, + { + "user_full_name": "Heath Vanalphen", + "roles": "admin", + "goal": "Assign Heath Vanalphen the admin role" + }, + { + "user_full_name": "Tami Trybus", + "roles": "admin", + "goal": "Assign Tami Trybus the admin role" + }, + { + "user_full_name": "Kyle Ferri", + "roles": "admin", + "goal": "Assign Kyle Ferri the admin role" + }, + { + "user_full_name": "Marisa Woldridge", + "roles": "admin", + "goal": "Assign Marisa Woldridge the admin role" + }, + { + "user_full_name": "Mike Hussey", + "roles": "admin", + "goal": "Assign Mike Hussey the admin role" + }, + { + "user_full_name": "Margarito Kornbau", + "roles": "admin", + "goal": "Assign Margarito Kornbau the admin role" + }, + { + "user_full_name": "Saundra Mcaulay", + "roles": "admin", + "goal": "Assign Saundra Mcaulay the admin role" + }, + { + "user_full_name": "Fred Kunde", + "roles": "admin", + "goal": "Assign Fred Kunde the admin role" + }, + { + "user_full_name": "Danette Fostervold", + "roles": "admin", + "goal": "Assign Danette Fostervold the admin role" + }, + { + "user_full_name": "Helga Windle", + "roles": "admin", + "goal": "Assign Helga Windle the admin role" + }, + { + "user_full_name": "Stephen Seiters", + "roles": "admin", + "goal": "Assign Stephen Seiters the admin role" + }, + { + "user_full_name": "Reva Bayer", + "roles": "admin", + "goal": "Assign Reva Bayer the admin role" + }, + { + "user_full_name": "Sue Haakinson", + "roles": "admin", + "goal": "Assign Sue Haakinson the admin role" + }, + { + "user_full_name": "Kay Ganguli", + "roles": "admin", + "goal": "Assign Kay Ganguli the admin role" + }, + { + "user_full_name": "Mac Marksberry", + "roles": "admin", + "goal": "Assign Mac Marksberry the admin role" + }, + { + "user_full_name": "Jimmy Hrobsky", + "roles": "admin", + "goal": "Assign Jimmy Hrobsky the admin role" + }, + { + "user_full_name": "Kennith Peto", + "roles": "admin", + "goal": "Assign Kennith Peto the admin role" + }, + { + "user_full_name": "Kelli Varrato", + "roles": "admin", + "goal": "Assign Kelli Varrato the admin role" + }, + { + "user_full_name": "Kurtis Mcbay", + "roles": "admin", + "goal": "Assign Kurtis Mcbay the admin role" + }, + { + "user_full_name": "Darrel Tork", + "roles": "admin", + "goal": "Assign Darrel Tork the admin role" + }, + { + "user_full_name": "John Retak", + "roles": "admin", + "goal": "Assign John Retak the admin role" + }, + { + "user_full_name": "Fausto Marks", + "roles": "admin", + "goal": "Assign Fausto Marks the admin role" + }, + { + "user_full_name": "Naomi Mcraven", + "roles": "admin", + "goal": "Assign Naomi Mcraven the admin role" + }, + { + "user_full_name": "Lyndon Bellerdine", + "roles": "admin", + "goal": "Assign Lyndon Bellerdine the admin role" + }, + { + "user_full_name": "Lacy Hyten", + "roles": "admin", + "goal": "Assign Lacy Hyten the admin role" + }, + { + "user_full_name": "Lamar Mckibben", + "roles": "admin", + "goal": "Assign Lamar Mckibben the admin role" + }, + { + "user_full_name": "Nathanial Phoenix", + "roles": "admin", + "goal": "Assign Nathanial Phoenix the admin role" + }, + { + "user_full_name": "Brenda Thomson", + "roles": "admin", + "goal": "Assign Brenda Thomson the admin role" + }, + { + "user_full_name": "Helene Iberg", + "roles": "admin", + "goal": "Assign Helene Iberg the admin role" + }, + { + "user_full_name": "Denver Topete", + "roles": "admin", + "goal": "Assign Denver Topete the admin role" + }, + { + "user_full_name": "Antonius Bullach", + "roles": "admin", + "goal": "Assign Antonius Bullach the admin role" + }, + { + "user_full_name": "Jodi Seals", + "roles": "admin", + "goal": "Assign Jodi Seals the admin role" + }, + { + "user_full_name": "Burton Brining", + "roles": "admin", + "goal": "Assign Burton Brining the admin role" + }, + { + "user_full_name": "Claire Moyerman", + "roles": "admin", + "goal": "Assign Claire Moyerman the admin role" + }, + { + "user_full_name": "Amelia Caputo", + "roles": "admin", + "goal": "Assign Amelia Caputo the admin role" + }, + { + "user_full_name": "Lucius Winchester", + "roles": "admin", + "goal": "Assign Lucius Winchester the admin role" + }, + { + "user_full_name": "Mariano Maury", + "roles": "admin", + "goal": "Assign Mariano Maury the admin role" + }, + { + "user_full_name": "Alyssa Biasotti", + "roles": "admin", + "goal": "Assign Alyssa Biasotti the admin role" + }, + { + "user_full_name": "Fabian Mcshaw", + "roles": "admin", + "goal": "Assign Fabian Mcshaw the admin role" + }, + { + "user_full_name": "Maurine Monroy", + "roles": "admin", + "goal": "Assign Maurine Monroy the admin role" + }, + { + "user_full_name": "Joe Employee", + "roles": "admin", + "goal": "Assign Joe Employee the admin role" + }, + { + "user_full_name": "John Chipley", + "roles": "admin", + "goal": "Assign John Chipley the admin role" + }, + { + "user_full_name": "Lucas Santellana", + "roles": "admin", + "goal": "Assign Lucas Santellana the admin role" + }, + { + "user_full_name": "Concetta Sarchett", + "roles": "admin", + "goal": "Assign Concetta Sarchett the admin role" + }, + { + "user_full_name": "Megan Burke", + "roles": "admin", + "goal": "Assign Megan Burke the admin role" + }, + { + "user_full_name": "Rebekah Lindboe", + "roles": "admin", + "goal": "Assign Rebekah Lindboe the admin role" + }, + { + "user_full_name": "Gaston Cieloszyk", + "roles": "admin", + "goal": "Assign Gaston Cieloszyk the admin role" + }, + { + "user_full_name": "Mike Rogers", + "roles": "admin", + "goal": "Assign Mike Rogers the admin role" + }, + { + "user_full_name": "Rita Center", + "roles": "admin", + "goal": "Assign Rita Center the admin role" + }, + { + "user_full_name": "Ike Zeolla", + "roles": "admin", + "goal": "Assign Ike Zeolla the admin role" + }, + { + "user_full_name": "Incident Manageratf", + "roles": "admin", + "goal": "Assign Incident Manageratf the admin role" + }, + { + "user_full_name": "Mara Vanderzwaag", + "roles": "admin", + "goal": "Assign Mara Vanderzwaag the admin role" + }, + { + "user_full_name": "Francis Soo", + "roles": "admin", + "goal": "Assign Francis Soo the admin role" + }, + { + "user_full_name": "Don Mestler", + "roles": "admin", + "goal": "Assign Don Mestler the admin role" + }, + { + "user_full_name": "Lucien Iurato", + "roles": "admin", + "goal": "Assign Lucien Iurato the admin role" + }, + { + "user_full_name": "Kenya Bruni", + "roles": "admin", + "goal": "Assign Kenya Bruni the admin role" + }, + { + "user_full_name": "Cyril Behen", + "roles": "admin", + "goal": "Assign Cyril Behen the admin role" + }, + { + "user_full_name": "Forest Orea", + "roles": "admin", + "goal": "Assign Forest Orea the admin role" + }, + { + "user_full_name": "Bob Redford", + "roles": "admin", + "goal": "Assign Bob Redford the admin role" + }, + { + "user_full_name": "Problem Task Analyst A", + "roles": "admin", + "goal": "Assign Problem Task Analyst A the admin role" + }, + { + "user_full_name": "Marquita Bousman", + "roles": "admin", + "goal": "Assign Marquita Bousman the admin role" + }, + { + "user_full_name": "Bryant Bouliouris", + "roles": "admin", + "goal": "Assign Bryant Bouliouris the admin role" + }, + { + "user_full_name": "Brendan Qin", + "roles": "admin", + "goal": "Assign Brendan Qin the admin role" + }, + { + "user_full_name": "Problem Administrator", + "roles": "admin", + "goal": "Assign Problem Administrator the admin role" + }, + { + "user_full_name": "Morton Crummell", + "roles": "admin", + "goal": "Assign Morton Crummell the admin role" + }, + { + "user_full_name": "Sharlene Circelli", + "roles": "admin", + "goal": "Assign Sharlene Circelli the admin role" + }, + { + "user_full_name": "Billie Tinnes", + "roles": "admin", + "goal": "Assign Billie Tinnes the admin role" + }, + { + "user_full_name": "Haley Rocheford", + "roles": "admin", + "goal": "Assign Haley Rocheford the admin role" + }, + { + "user_full_name": "Ione Kucera", + "roles": "admin", + "goal": "Assign Ione Kucera the admin role" + }, + { + "user_full_name": "Freida Michelfelder", + "roles": "admin", + "goal": "Assign Freida Michelfelder the admin role" + }, + { + "user_full_name": "Janice Twiet", + "roles": "admin", + "goal": "Assign Janice Twiet the admin role" + }, + { + "user_full_name": "Service Desk", + "roles": "admin", + "goal": "Assign Service Desk the admin role" + }, + { + "user_full_name": "Sean Bonnet", + "roles": "admin", + "goal": "Assign Sean Bonnet the admin role" + }, + { + "user_full_name": "Annette Frietas", + "roles": "admin", + "goal": "Assign Annette Frietas the admin role" }, { "user_full_name": "Bridget Bottella", @@ -10,18 +3355,138 @@ "goal": "Assign Bridget Bottella the admin role" }, { - "user_full_name": "Roger Seid", + "user_full_name": "Gil Scarpa", "roles": "admin", - "goal": "Assign Roger Seid the admin role" + "goal": "Assign Gil Scarpa the admin role" }, { - "user_full_name": "Alisa Chinoy", + "user_full_name": "Brian White", "roles": "admin", - "goal": "Assign Alisa Chinoy the admin role" + "goal": "Assign Brian White the admin role" }, { - "user_full_name": "Chi Greenlaw", + "user_full_name": "Shanna Neundorfer", "roles": "admin", - "goal": "Assign Chi Greenlaw the admin role" + "goal": "Assign Shanna Neundorfer the admin role" + }, + { + "user_full_name": "Carol Krisman", + "roles": "admin", + "goal": "Assign Carol Krisman the admin role" + }, + { + "user_full_name": "Johnie Minaai", + "roles": "admin", + "goal": "Assign Johnie Minaai the admin role" + }, + { + "user_full_name": "Dude Lewbowskie", + "roles": "admin", + "goal": "Assign Dude Lewbowskie the admin role" + }, + { + "user_full_name": "Courtney Shishido", + "roles": "admin", + "goal": "Assign Courtney Shishido the admin role" + }, + { + "user_full_name": "Jane Contact", + "roles": "admin", + "goal": "Assign Jane Contact the admin role" + }, + { + "user_full_name": "Devon Samrah", + "roles": "admin", + "goal": "Assign Devon Samrah the admin role" + }, + { + "user_full_name": "Ella Pahnke", + "roles": "admin", + "goal": "Assign Ella Pahnke the admin role" + }, + { + "user_full_name": "Efren Baucher", + "roles": "admin", + "goal": "Assign Efren Baucher the admin role" + }, + { + "user_full_name": "Edwin Forman", + "roles": "admin", + "goal": "Assign Edwin Forman the admin role" + }, + { + "user_full_name": "WM InitiatorQualifierDispatcher", + "roles": "admin", + "goal": "Assign WM InitiatorQualifierDispatcher the admin role" + }, + { + "user_full_name": "Carmel Overfelt", + "roles": "admin", + "goal": "Assign Carmel Overfelt the admin role" + }, + { + "user_full_name": "Adela Cervantsz", + "roles": "admin", + "goal": "Assign Adela Cervantsz the admin role" + }, + { + "user_full_name": "Sheryl Sisofo", + "roles": "admin", + "goal": "Assign Sheryl Sisofo the admin role" + }, + { + "user_full_name": "Jade Erlebach", + "roles": "admin", + "goal": "Assign Jade Erlebach the admin role" + }, + { + "user_full_name": "Ingrid Blake", + "roles": "admin", + "goal": "Assign Ingrid Blake the admin role" + }, + { + "user_full_name": "Lynn Saulsberry", + "roles": "admin", + "goal": "Assign Lynn Saulsberry the admin role" + }, + { + "user_full_name": "Elaine Renzi", + "roles": "admin", + "goal": "Assign Elaine Renzi the admin role" + }, + { + "user_full_name": "Berta Karczewski", + "roles": "admin", + "goal": "Assign Berta Karczewski the admin role" + }, + { + "user_full_name": "Jeanie Dalen", + "roles": "admin", + "goal": "Assign Jeanie Dalen the admin role" + }, + { + "user_full_name": "Mona Lisa", + "roles": "admin", + "goal": "Assign Mona Lisa the admin role" + }, + { + "user_full_name": "Guillermo Frohlich", + "roles": "admin", + "goal": "Assign Guillermo Frohlich the admin role" + }, + { + "user_full_name": "User 1", + "roles": "admin", + "goal": "Assign User 1 the admin role" + }, + { + "user_full_name": "Rosalia Kennemur", + "roles": "admin", + "goal": "Assign Rosalia Kennemur the admin role" + }, + { + "user_full_name": "Carl Customer", + "roles": "admin", + "goal": "Assign Carl Customer the admin role" } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json index 4792ae2..b2e8d0c 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_explicit.json @@ -1,13 +1,2623 @@ [ + { + "user_full_name": "Mabel Weeden", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mabel Weeden the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "ESC Admin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign ESC Admin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reginald Lunan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reginald Lunan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Diann Burigsay", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Diann Burigsay the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Roseann Jerko", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Roseann Jerko the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Titus Rodreguez", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Titus Rodreguez the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Chris Harris", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Chris Harris the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ezekiel Mildon", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ezekiel Mildon the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Virgil Chinni", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Virgil Chinni the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Saundra Mcaulay", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Saundra Mcaulay the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Deanna Gerbi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Deanna Gerbi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hanna Cinkan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hanna Cinkan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alene Rabeck", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alene Rabeck the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ross Spurger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ross Spurger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Naomi Caetano", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Naomi Caetano the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Paul Shafer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Paul Shafer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sadie Rowlett", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sadie Rowlett the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Maurine Monroy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Maurine Monroy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lacy Hyten", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lacy Hyten the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jimmy Hrobsky", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jimmy Hrobsky the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Terra Plagge", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Terra Plagge the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sandra Graen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sandra Graen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Latisha Bahls", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Latisha Bahls the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Luciano Truiolo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Luciano Truiolo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mildred Gallegas", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mildred Gallegas the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lizzie Torregrossa", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lizzie Torregrossa the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Annie Approver", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Annie Approver the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Derek Kreutzbender", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Derek Kreutzbender the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Modesto Scroggie", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Modesto Scroggie the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Maryjane Arata", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Maryjane Arata the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carmella Wishman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carmella Wishman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Neva Marsell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Neva Marsell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Val Oborne", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Val Oborne the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Beverly Cambel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Beverly Cambel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Vince Ettel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Vince Ettel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Guest", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Guest the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Armando Papik", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Armando Papik the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Wilmer Constantineau", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Wilmer Constantineau the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Traci Toomey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Traci Toomey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marcelo Arostegui", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marcelo Arostegui the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Pamala Brodtmann", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Pamala Brodtmann the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jeanie Dalen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jeanie Dalen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Delphine Helmich", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Delphine Helmich the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ashley Parker", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ashley Parker the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Byron Fortuna", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Byron Fortuna the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lyndon Bellerdine", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lyndon Bellerdine the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kory Wooldridge", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kory Wooldridge the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Meredith Ivrin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Meredith Ivrin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dwain Cuttitta", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dwain Cuttitta the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robt Braithwaite", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robt Braithwaite the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Amy Arquette", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Amy Arquette the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Helga Windle", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Helga Windle the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Winnie Reich", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Winnie Reich the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Prince Kauk", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Prince Kauk the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mara Rineheart", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mara Rineheart the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gilly Parker", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gilly Parker the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Thomas Pfeifer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Thomas Pfeifer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lucius Bagnoli", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lucius Bagnoli the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carl Customer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carl Customer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gale Nolau", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gale Nolau the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Doug Matrisciano", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Doug Matrisciano the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Taylor Fogerty", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Taylor Fogerty the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alyssa Biasotti", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alyssa Biasotti the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reina Reisenauer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reina Reisenauer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mara Vanderzwaag", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mara Vanderzwaag the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alva Pennigton", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alva Pennigton the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Craig Parker", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Craig Parker the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jess Assad", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jess Assad the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Approver User", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Approver User the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gayla Geimer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gayla Geimer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marisa Woldridge", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marisa Woldridge the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Valeria Lingbeek", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Valeria Lingbeek the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Don Mestler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Don Mestler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Curt Menedez", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Curt Menedez the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rebekah Lindboe", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rebekah Lindboe the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Melissa Pena", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Melissa Pena the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lynda Youtsey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lynda Youtsey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Andrew Chen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Andrew Chen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rodrigo Wildrick", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rodrigo Wildrick the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Norman Betance", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Norman Betance the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Trudy Worlds", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Trudy Worlds the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lucius Winchester", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lucius Winchester the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mayme Staub", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mayme Staub the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Efren Baucher", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Efren Baucher the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cindy Contact", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cindy Contact the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Fran Zanders", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Fran Zanders the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Isaac Davensizer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Isaac Davensizer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Shanna Numkena", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Shanna Numkena the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Borris Becker", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Borris Becker the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dollie Pillitteri", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dollie Pillitteri the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dionne Borycz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dionne Borycz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Charles Beckley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Charles Beckley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Antony Thierauf", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Antony Thierauf the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hans Fischer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hans Fischer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Stephen Seiters", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Stephen Seiters the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cherie Fuhri", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cherie Fuhri the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alfonso Griglen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alfonso Griglen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Amy Pascal", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Amy Pascal the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jerrod Bennett", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jerrod Bennett the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Edward Smith", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Edward Smith the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Melinda Carleton", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Melinda Carleton the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Neil Backus", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Neil Backus the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Son Marschke", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Son Marschke the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Password Admin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Password Admin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Fausto Marks", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Fausto Marks the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sofia Taylor", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sofia Taylor the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carla Sirbaugh", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carla Sirbaugh the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Erica Eyrich", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Erica Eyrich the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Eli Bettner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Eli Bettner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jeri Farstvedt", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jeri Farstvedt the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Praveen Vootkuri", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Praveen Vootkuri the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mitch Schattner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mitch Schattner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Willa Dutt", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Willa Dutt the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jake Throgmorton", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jake Throgmorton the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lynn Saulsberry", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lynn Saulsberry the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bert Schadle", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bert Schadle the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Brant Darnel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Brant Darnel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Isabell Armout", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Isabell Armout the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Terrell Rodda", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Terrell Rodda the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jimmie Hardgrove", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jimmie Hardgrove the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Isiah Phernetton", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Isiah Phernetton the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "George Warren", + "roles": "canvas_admin, canvas_user", + "goal": "Assign George Warren the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jane Contact", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jane Contact the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alissa Mountjoy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alissa Mountjoy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Annette Frietas", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Annette Frietas the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Audra Cantu", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Audra Cantu the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gregg Guevarra", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gregg Guevarra the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marshall Hutch", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marshall Hutch the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ofelia Sheffler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ofelia Sheffler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Brendan Qin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Brendan Qin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Felipe Gould", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Felipe Gould the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mitchel Harnar", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mitchel Harnar the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reggie Streu", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reggie Streu the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Freeman Soula", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Freeman Soula the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Raphael Bickel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Raphael Bickel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Walton Schwallie", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Walton Schwallie the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lina Hybarger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lina Hybarger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Heath Vazquez", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Heath Vazquez the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marla Folz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marla Folz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rich Gleave", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rich Gleave the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Diana Temple", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Diana Temple the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Morton Crummell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Morton Crummell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bridget Knightly", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bridget Knightly the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Logan Muhl", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Logan Muhl the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sam Collins", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sam Collins the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kasey Nguyen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kasey Nguyen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rosemarie Fifield", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rosemarie Fifield the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jade Erlebach", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jade Erlebach the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Daniel Kraig", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Daniel Kraig the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Janice Twiet", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Janice Twiet the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Corinne Cowan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Corinne Cowan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Judi Kivel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Judi Kivel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lashawn Hasty", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lashawn Hasty the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Charlie White", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Charlie White the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lora Lendor", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lora Lendor the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Deandre Resendiz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Deandre Resendiz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Elisa Gracely", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Elisa Gracely the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Fabian Mcshaw", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Fabian Mcshaw the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lucas Santellana", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lucas Santellana the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "ml_report.user ", + "roles": "canvas_admin, canvas_user", + "goal": "Assign ml_report.user the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lacy Woodfin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lacy Woodfin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Judy Gartenmayer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Judy Gartenmayer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Vernon Engelman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Vernon Engelman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reina Wolchesky", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reina Wolchesky the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marcie Shulz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marcie Shulz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ray Srock", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ray Srock the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jimmie Barninger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jimmie Barninger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Leslie Cackowski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Leslie Cackowski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Beverley Bunche", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Beverley Bunche the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Renae Eldrige", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Renae Eldrige the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Emilia Oxley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Emilia Oxley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hans Carlan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hans Carlan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lyman Whittley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lyman Whittley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Abraham Lincoln", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Abraham Lincoln the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Chase Furler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Chase Furler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ella Pahnke", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ella Pahnke the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jessie Barkle", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jessie Barkle the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Roger Rasmussen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Roger Rasmussen the following roles: canvas_admin, canvas_user" + }, { "user_full_name": "Minh Leclare", "roles": "canvas_admin, canvas_user", - "goal": "Assign Minh Leclare the following roles: canvas_admin, canvas_user" + "goal": "Assign Minh Leclare the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kylie Bridgeman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kylie Bridgeman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Melody Saddat", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Melody Saddat the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kris Stanzak", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kris Stanzak the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rosalie Krigger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rosalie Krigger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Claire Moyerman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Claire Moyerman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lacy Belmont", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lacy Belmont the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Password User", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Password User the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cameron Richard", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cameron Richard the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Security Center Data Collection User", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Security Center Data Collection User the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marlene Hammeren", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marlene Hammeren the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kennith Peto", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kennith Peto the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kelli Varrato", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kelli Varrato the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bette Barcelona", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bette Barcelona the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Caitlin Reiniger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Caitlin Reiniger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robin Schartz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robin Schartz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kurtis Mcbay", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kurtis Mcbay the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Crissy Stark", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Crissy Stark the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Valentine Granberry", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Valentine Granberry the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Martin Carley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Martin Carley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Suzette Devaughan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Suzette Devaughan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Christa Bodenschatz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Christa Bodenschatz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sybil Marmerchant", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sybil Marmerchant the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Junior Wadlinger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Junior Wadlinger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Felipe Mahone", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Felipe Mahone the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Suresh Yekollu", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Suresh Yekollu the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Linda Cox", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Linda Cox the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Christian Marnell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Christian Marnell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gil Scarpa", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gil Scarpa the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tori Villaescusa", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tori Villaescusa the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mike Hussey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mike Hussey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reginald Humes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reginald Humes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Amy Chen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Amy Chen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Janet Schaffter", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Janet Schaffter the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bradly Hasselvander", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bradly Hasselvander the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Benjamin Schkade", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Benjamin Schkade the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Veronica Achorn", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Veronica Achorn the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rita Center", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rita Center the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Donald Sherretts", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Donald Sherretts the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Maynard Kaewprasert", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Maynard Kaewprasert the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Katina Survant", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Katina Survant the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Elaine Renzi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Elaine Renzi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Misty Ericksen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Misty Ericksen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Roman Simone", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Roman Simone the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rosalia Kennemur", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rosalia Kennemur the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robin Grotz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robin Grotz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marc Wanger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marc Wanger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Barbara Hindley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Barbara Hindley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Darrel Ruffins", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Darrel Ruffins the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mary Maurizio", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mary Maurizio the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Berta Karczewski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Berta Karczewski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mariano Maury", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mariano Maury the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "SOAP Guest", + "roles": "canvas_admin, canvas_user", + "goal": "Assign SOAP Guest the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Thomas Jefferson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Thomas Jefferson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Pilar Suddeth", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Pilar Suddeth the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bridgett Retort", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bridgett Retort the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Elmo Dagenais", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Elmo Dagenais the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Keisha Ransonet", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Keisha Ransonet the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Devon Samrah", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Devon Samrah the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Maryanne Whyman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Maryanne Whyman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kris Persson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kris Persson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Naomi Greenly", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Naomi Greenly the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marion Gaulden", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marion Gaulden the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Denice Nordlinger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Denice Nordlinger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "John Retak", + "roles": "canvas_admin, canvas_user", + "goal": "Assign John Retak the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sheryl Sisofo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sheryl Sisofo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jason Roy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jason Roy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lamar Mckibben", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lamar Mckibben the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ashley Leonesio", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ashley Leonesio the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Eddie Gauer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Eddie Gauer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lynette Setlock", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lynette Setlock the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rosalyn Daulton", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rosalyn Daulton the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cherie Schronce", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cherie Schronce the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Darrel Tork", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Darrel Tork the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Fred Kunde", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Fred Kunde the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kira Papen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kira Papen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Simone Lundie", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Simone Lundie the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Geri Forness", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Geri Forness the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Chad Miklas", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Chad Miklas the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Benchmark Scheduler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Benchmark Scheduler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Barton Friesner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Barton Friesner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mac Marksberry", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mac Marksberry the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "ml.admin ", + "roles": "canvas_admin, canvas_user", + "goal": "Assign ml.admin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Millicent Ekstrom", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Millicent Ekstrom the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Angelo Ferentz", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Angelo Ferentz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "David Miller", + "roles": "canvas_admin, canvas_user", + "goal": "Assign David Miller the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Nanette Turansky", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Nanette Turansky the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tamara Declue", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tamara Declue the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Stacey Blow", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Stacey Blow the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Janet Rathrock", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Janet Rathrock the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tammie Schwartzwalde", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tammie Schwartzwalde the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "System Administrator", + "roles": "canvas_admin, canvas_user", + "goal": "Assign System Administrator the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Eduardo Bellendir", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Eduardo Bellendir the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sam Sorokin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sam Sorokin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Peggy Hohlstein", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Peggy Hohlstein the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Owen Sparacino", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Owen Sparacino the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mike Rogers", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mike Rogers the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ingrid Blake", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ingrid Blake the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Denise Speegle", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Denise Speegle the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jeremy Lampi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jeremy Lampi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lana Garrigus", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lana Garrigus the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marta Warran", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marta Warran the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Charity Dyckman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Charity Dyckman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lashonda Enote", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lashonda Enote the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Patty Bernasconi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Patty Bernasconi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Germaine Bruski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Germaine Bruski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jarrett Kenzie", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jarrett Kenzie the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ramon Amaral", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ramon Amaral the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Teri Erlewine", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Teri Erlewine the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Michael Hoefer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Michael Hoefer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kira Staffon", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kira Staffon the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Edgardo Prudente", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Edgardo Prudente the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Justina Dragaj", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Justina Dragaj the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jasmin Gum", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jasmin Gum the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Virtual Agent", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Virtual Agent the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robert Turner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robert Turner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Davin Czukowski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Davin Czukowski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "survey user", + "roles": "canvas_admin, canvas_user", + "goal": "Assign survey user the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "John Adams", + "roles": "canvas_admin, canvas_user", + "goal": "Assign John Adams the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Karen Flierl", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Karen Flierl the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marquita Bousman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marquita Bousman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marcelino Maggs", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marcelino Maggs the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Athena Fontanilla", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Athena Fontanilla the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sophie Langner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sophie Langner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carol Krisman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carol Krisman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Enrique Oroark", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Enrique Oroark the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Guillermo Tsang", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Guillermo Tsang the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Petra Mcnichol", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Petra Mcnichol the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Zane Sulikowski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Zane Sulikowski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Devon Teston", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Devon Teston the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Courtney Shishido", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Courtney Shishido the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Madonna Cosby", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Madonna Cosby the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kennith Kirklin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kennith Kirklin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mark Johnson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mark Johnson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Olga Yarovenko", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Olga Yarovenko the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kristine Paker", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kristine Paker the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Danette Fostervold", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Danette Fostervold the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marianne Earman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marianne Earman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Vernice Resendes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Vernice Resendes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kyle Ferri", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kyle Ferri the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Milton Kuhlman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Milton Kuhlman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Joey Bolick", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Joey Bolick the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tommie Reuland", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tommie Reuland the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alex Linde", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alex Linde the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gaston Cieloszyk", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gaston Cieloszyk the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Concetta Sarchett", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Concetta Sarchett the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marisa Smiler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marisa Smiler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mellissa Sule", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mellissa Sule the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dude Lewbowskie", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dude Lewbowskie the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Karen Zombo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Karen Zombo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Karyn Jinks", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Karyn Jinks the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sheila Holloran", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sheila Holloran the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Becky Chan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Becky Chan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Deepa Shah", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Deepa Shah the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Vivian Brzostowski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Vivian Brzostowski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cyril Behen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cyril Behen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Damion Matkin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Damion Matkin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tami Trybus", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tami Trybus the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rachel Larrison", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rachel Larrison the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Pierre Salera", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Pierre Salera the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Darrell Amrich", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Darrell Amrich the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Eldon Sutch", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Eldon Sutch the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ione Kucera", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ione Kucera the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Katina Ramano", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Katina Ramano the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Antonio Bencum", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Antonio Bencum the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Joe Employee", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Joe Employee the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jimmie Kertzman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jimmie Kertzman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dwain Agricola", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dwain Agricola the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Conrad Lanfear", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Conrad Lanfear the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Credential Admin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Credential Admin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jonathon Waldall", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jonathon Waldall the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Van Leanen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Van Leanen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Roxie Varenhorst", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Roxie Varenhorst the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bertram Quertermous", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bertram Quertermous the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Nadia Wilshire", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Nadia Wilshire the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ted Keppel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ted Keppel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Trey Tout", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Trey Tout the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carmel Overfelt", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carmel Overfelt the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "User 1", + "roles": "canvas_admin, canvas_user", + "goal": "Assign User 1 the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Nathanial Phoenix", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Nathanial Phoenix the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Frankie Morein", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Frankie Morein the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Heriberto Tivis", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Heriberto Tivis the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jacinto Gawron", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jacinto Gawron the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Margaret Grey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Margaret Grey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ike Benthin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ike Benthin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robyn Christophel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robyn Christophel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ruthie Zortman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ruthie Zortman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Megan Burke", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Megan Burke the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Florine Willardson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Florine Willardson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hilario Cassa", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hilario Cassa the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mandy Mcdonnell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mandy Mcdonnell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Petra Clemmens", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Petra Clemmens the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tiffany Knust", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tiffany Knust the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Darrin Neiss", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Darrin Neiss the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Willard Roughen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Willard Roughen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lucien Iurato", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lucien Iurato the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Pat Hoshaw", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Pat Hoshaw the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Emilio Lampkin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Emilio Lampkin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mari Hwang", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mari Hwang the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Viola Mcsorley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Viola Mcsorley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rebeca Brumet", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rebeca Brumet the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Evan Pyfrom", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Evan Pyfrom the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Waldo Sisk", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Waldo Sisk the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Denver Topete", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Denver Topete the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jimmie Zarzycki", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jimmie Zarzycki the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rosanna Sandrock", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rosanna Sandrock the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Leif Arguin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Leif Arguin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Johnnie Rheaves", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Johnnie Rheaves the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lee Javens", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lee Javens the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Problem Task Analyst B", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Problem Task Analyst B the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bridget Bottella", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bridget Bottella the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "John Kennedy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign John Kennedy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reva Lecates", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reva Lecates the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Edwin Lavelli", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Edwin Lavelli the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Julie Lewis", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Julie Lewis the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Delmer Delucas", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Delmer Delucas the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rena Griffeth", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rena Griffeth the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Abel Tuter", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Abel Tuter the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Brent Vaidya", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Brent Vaidya the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Problem Task Analyst A", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Problem Task Analyst A the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Helena Suermann", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Helena Suermann the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Waldo Edberg", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Waldo Edberg the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tommy Gore", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tommy Gore the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Francis Soo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Francis Soo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Miranda Hammitt", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Miranda Hammitt the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Quintin Isacson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Quintin Isacson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Julius Reyes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Julius Reyes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bruno Smith", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bruno Smith the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Helene Iberg", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Helene Iberg the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hannah Facio", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hannah Facio the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dennis Millar", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dennis Millar the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Veronica Radman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Veronica Radman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Billie Cowley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Billie Cowley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Felecia Riedl", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Felecia Riedl the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Heath Vanalphen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Heath Vanalphen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Oma Duffy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Oma Duffy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ronald Hawes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ronald Hawes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "ECMDB Admin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign ECMDB Admin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rolando Baumann", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rolando Baumann the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alejandro Mascall", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alejandro Mascall the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Michelle Semmler", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Michelle Semmler the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Leif Bachta", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Leif Bachta the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jacklyn Emayo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jacklyn Emayo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Margot Arenburg", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Margot Arenburg the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reva Bayer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reva Bayer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Naomi Mcraven", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Naomi Mcraven the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Floyd Veazey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Floyd Veazey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Gisela Kosicki", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Gisela Kosicki the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Joel Nardo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Joel Nardo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sharlene Circelli", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sharlene Circelli the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jewel Agresta", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jewel Agresta the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sal Pindell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sal Pindell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Laurie Bigg", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Laurie Bigg the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carla Humble", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carla Humble the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Zackary Mockus", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Zackary Mockus the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kathie Argenti", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kathie Argenti the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Nickolas Khosravi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Nickolas Khosravi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Burton Brining", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Burton Brining the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tia Lino", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tia Lino the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Theron Hambright", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Theron Hambright the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Emery Reek", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Emery Reek the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Armando Kolm", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Armando Kolm the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Genevieve Kekiwi", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Genevieve Kekiwi the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Billie Tinnes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Billie Tinnes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ed Gompf", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ed Gompf the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Hillary Holmes", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Hillary Holmes the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Nelly Jakuboski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Nelly Jakuboski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Georgette Bandyk", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Georgette Bandyk the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Amos Linnan", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Amos Linnan the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bess Marso", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bess Marso the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marta Hoch", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marta Hoch the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sitemap Scheduler User ", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sitemap Scheduler User the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Annabelle Coger", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Annabelle Coger the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Johnie Minaai", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Johnie Minaai the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rebekah Padley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rebekah Padley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cruz Roudabush", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cruz Roudabush the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Robbie Deshay", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Robbie Deshay the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tricia Kruss", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tricia Kruss the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kyle Lindauer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kyle Lindauer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Laurie Bibbs", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Laurie Bibbs the following roles: canvas_admin, canvas_user" }, { - "user_full_name": "Roman Simone", + "user_full_name": "Lesa Chantry", "roles": "canvas_admin, canvas_user", - "goal": "Assign Roman Simone the following roles: canvas_admin, canvas_user" + "goal": "Assign Lesa Chantry the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Clarice Knower", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Clarice Knower the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kevin Edd", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kevin Edd the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tyron Quillman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tyron Quillman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Danny Dales", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Danny Dales the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kurtis Asberry", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kurtis Asberry the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Harding Asher", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Harding Asher the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Randal Gansen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Randal Gansen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Antione Mccleary", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Antione Mccleary the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kay Ganguli", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kay Ganguli the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Teodoro Gaboury", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Teodoro Gaboury the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Chad Araiza", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Chad Araiza the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jude Haza", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jude Haza the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Merle Wyrosdick", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Merle Wyrosdick the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Scott Seixas", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Scott Seixas the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Samantha Bordwell", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Samantha Bordwell the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Freida Michelfelder", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Freida Michelfelder the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Rene Dummermuth", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Rene Dummermuth the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lana Keels", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lana Keels the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "George Washington", + "roles": "canvas_admin, canvas_user", + "goal": "Assign George Washington the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Bryant Bouliouris", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Bryant Bouliouris the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Allie Pumphrey", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Allie Pumphrey the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Lona Scronce", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Lona Scronce the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marietta Bjornberg", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marietta Bjornberg the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Maryann Garnette", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Maryann Garnette the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Reyna Bangle", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Reyna Bangle the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Brice Hedglin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Brice Hedglin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Buster Wubbel", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Buster Wubbel the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Faiza Ramos", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Faiza Ramos the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Celia Slavin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Celia Slavin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tisha Gorder", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tisha Gorder the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Davis Heideman", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Davis Heideman the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ricky Tom", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ricky Tom the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sean Bonnet", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sean Bonnet the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "John Chipley", + "roles": "canvas_admin, canvas_user", + "goal": "Assign John Chipley the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Shanna Neundorfer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Shanna Neundorfer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Cathryn Nicolaus", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Cathryn Nicolaus the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Kathleen Beresnyak", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Kathleen Beresnyak the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Coleman Cuneo", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Coleman Cuneo the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Warren Speach", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Warren Speach the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Andrew Jackson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Andrew Jackson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Doreen Sakurai", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Doreen Sakurai the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "William Mahmud", + "roles": "canvas_admin, canvas_user", + "goal": "Assign William Mahmud the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Denis Koch", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Denis Koch the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Margarito Kornbau", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Margarito Kornbau the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "James Smith", + "roles": "canvas_admin, canvas_user", + "goal": "Assign James Smith the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Tia Neumaier", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Tia Neumaier the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Marta Horner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Marta Horner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Joey Sedore", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Joey Sedore the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Malissa Ziesemer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Malissa Ziesemer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dorthy Alexy", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dorthy Alexy the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Manuel Dienhart", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Manuel Dienhart the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Josephine Sotlar", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Josephine Sotlar the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Warren Hacher", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Warren Hacher the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Eliseo Wice", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Eliseo Wice the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Melvin Auteri", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Melvin Auteri the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Dwayne Maddalena", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Dwayne Maddalena the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Terrance Nimmer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Terrance Nimmer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Isaac Zackery", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Isaac Zackery the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sabrina Deppert", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sabrina Deppert the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mack Jurasin", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mack Jurasin the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Vanessa Lewallen", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Vanessa Lewallen the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Carolina Kinlaw", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Carolina Kinlaw the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sue Haakinson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sue Haakinson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Daniel Zill", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Daniel Zill the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Savannah Loffier", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Savannah Loffier the following roles: canvas_admin, canvas_user" }, { "user_full_name": "Yvette Kokoska", @@ -15,13 +2625,103 @@ "goal": "Assign Yvette Kokoska the following roles: canvas_admin, canvas_user" }, { - "user_full_name": "Don Mestler", + "user_full_name": "Allan Schwantd", "roles": "canvas_admin, canvas_user", - "goal": "Assign Don Mestler the following roles: canvas_admin, canvas_user" + "goal": "Assign Allan Schwantd the following roles: canvas_admin, canvas_user" }, { - "user_full_name": "Ella Pahnke", + "user_full_name": "Lane Brantz", "roles": "canvas_admin, canvas_user", - "goal": "Assign Ella Pahnke the following roles: canvas_admin, canvas_user" + "goal": "Assign Lane Brantz the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Peter Partner", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Peter Partner the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "survey creator", + "roles": "canvas_admin, canvas_user", + "goal": "Assign survey creator the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Miles Dyson", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Miles Dyson the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Wes Fontanella", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Wes Fontanella the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Service Desk", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Service Desk the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Jim Matthews", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Jim Matthews the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Mary Cruse", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Mary Cruse the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Charlie Brown", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Charlie Brown the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Forest Orea", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Forest Orea the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Angelique Schermerhorn", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Angelique Schermerhorn the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Miquel Demicco", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Miquel Demicco the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Timothy Janski", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Timothy Janski the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Alejandra Prenatt", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Alejandra Prenatt the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Ike Zeolla", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Ike Zeolla the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Boris Catino", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Boris Catino the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "WM Approver", + "roles": "canvas_admin, canvas_user", + "goal": "Assign WM Approver the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Elmo Gabouer", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Elmo Gabouer the following roles: canvas_admin, canvas_user" + }, + { + "user_full_name": "Sherwood Detillier", + "roles": "canvas_admin, canvas_user", + "goal": "Assign Sherwood Detillier the following roles: canvas_admin, canvas_user" } ] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json index eea84af..eb323de 100644 --- a/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json +++ b/src/browsergym/workarena/data_files/task_configs/assign_roles_to_user_implicit.json @@ -1,15 +1,333 @@ [ { - "user_full_name": "Lucien Iurato", + "user_full_name": "WM Qualifier", "role_family": "sn_incident", "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", - "goal": "Assign Lucien Iurato all of the \"sn_incident\" roles" + "goal": "Assign WM Qualifier all of the \"sn_incident\" roles" }, { - "user_full_name": "Josephine Sotlar", + "user_full_name": "Amy Pascal", "role_family": "sn_incident", "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", - "goal": "Assign Josephine Sotlar all of the \"sn_incident\" roles" + "goal": "Assign Amy Pascal all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Becky Chan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Becky Chan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bob Redford", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bob Redford all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lee Javens", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lee Javens all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Haley Rocheford", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Haley Rocheford all of the \"sn_incident\" roles" + }, + { + "user_full_name": "ECMDB Admin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign ECMDB Admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jake Throgmorton", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jake Throgmorton all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alisa Chinoy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alisa Chinoy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jade Erlebach", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jade Erlebach all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kelli Varrato", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kelli Varrato all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robert Turner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robert Turner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marlene Hammeren", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marlene Hammeren all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nanette Turansky", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nanette Turansky all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Helga Windle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Helga Windle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Beverley Bunche", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Beverley Bunche all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mack Jurasin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mack Jurasin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Floyd Veazey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Floyd Veazey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sam Collins", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sam Collins all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Model Manager", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Model Manager all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Crissy Stark", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Crissy Stark all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bert Schadle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bert Schadle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bae Kim", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bae Kim all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosalyn Daulton", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosalyn Daulton all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Walton Schwallie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Walton Schwallie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Enrique Oroark", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Enrique Oroark all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Paul Shafer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Paul Shafer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sybil Marmerchant", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sybil Marmerchant all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ricky John", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ricky John all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ella Pahnke", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ella Pahnke all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carmella Wishman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carmella Wishman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "survey user", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign survey user all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Malissa Ziesemer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Malissa Ziesemer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tami Trybus", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tami Trybus all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Delmer Delucas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Delmer Delucas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Valerie Pou", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Valerie Pou all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jimmie Kertzman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jimmie Kertzman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ezekiel Mildon", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ezekiel Mildon all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Misty Ericksen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Misty Ericksen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nirali Patel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nirali Patel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Password Admin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Password Admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Stacey Blow", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Stacey Blow all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Danette Fostervold", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Danette Fostervold all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robt Braithwaite", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robt Braithwaite all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jacinto Gawron", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jacinto Gawron all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Joey Bolick", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Joey Bolick all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kory Wooldridge", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kory Wooldridge all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sean Bonnet", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sean Bonnet all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lashawn Hasty", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lashawn Hasty all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Janice Twiet", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Janice Twiet all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Joey Sedore", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Joey Sedore all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tiffany Knust", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tiffany Knust all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Janet Rathrock", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Janet Rathrock all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Diann Burigsay", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Diann Burigsay all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Son Marschke", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Son Marschke all of the \"sn_incident\" roles" }, { "user_full_name": "Kerry Evertt", @@ -18,15 +336,3645 @@ "goal": "Assign Kerry Evertt all of the \"sn_incident\" roles" }, { - "user_full_name": "Miquel Demicco", + "user_full_name": "Darrel Tork", "role_family": "sn_incident", "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", - "goal": "Assign Miquel Demicco all of the \"sn_incident\" roles" + "goal": "Assign Darrel Tork all of the \"sn_incident\" roles" }, { - "user_full_name": "William Mahmud", + "user_full_name": "Davin Czukowski", "role_family": "sn_incident", "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", - "goal": "Assign William Mahmud all of the \"sn_incident\" roles" + "goal": "Assign Davin Czukowski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lora Lendor", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lora Lendor all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kira Papen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kira Papen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rick Berzle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rick Berzle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lynda Youtsey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lynda Youtsey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Martin Carley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Martin Carley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Florine Willardson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Florine Willardson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Randall Kluemper", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Randall Kluemper all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Zane Sulikowski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Zane Sulikowski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Janet Schaffter", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Janet Schaffter all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gil Scarpa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gil Scarpa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bridget Bottella", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bridget Bottella all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sofia Taylor", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sofia Taylor all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lottie Voll", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lottie Voll all of the \"sn_incident\" roles" + }, + { + "user_full_name": "James Smith", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign James Smith all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Pierre Salera", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Pierre Salera all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rubin Crotts", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rubin Crotts all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kennith Peto", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kennith Peto all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Baker Huges", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Baker Huges all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Antony Thierauf", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Antony Thierauf all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Samantha Bordwell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Samantha Bordwell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Wilfredo Gidley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Wilfredo Gidley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kyle Lindauer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kyle Lindauer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jewel Agresta", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jewel Agresta all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Charity Dyckman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Charity Dyckman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Petra Mcnichol", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Petra Mcnichol all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sarah White", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sarah White all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rich Gleave", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rich Gleave all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jessie Barkle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jessie Barkle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mellissa Sule", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mellissa Sule all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Conrad Lanfear", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Conrad Lanfear all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Corinne Cowan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Corinne Cowan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kira Staffon", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kira Staffon all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Daniel Smith", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Daniel Smith all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Doug Matrisciano", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Doug Matrisciano all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Laurie Bigg", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Laurie Bigg all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Melinda Carleton", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Melinda Carleton all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mayme Staub", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mayme Staub all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jimmie Zarzycki", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jimmie Zarzycki all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sandra Graen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sandra Graen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chad Miklas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chad Miklas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jess Assad", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jess Assad all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Isiah Phernetton", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Isiah Phernetton all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Germaine Bruski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Germaine Bruski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lisa Ray", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lisa Ray all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Abel Tuter", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Abel Tuter all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Armando Kolm", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Armando Kolm all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reyna Bangle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reyna Bangle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Beverly Cambel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Beverly Cambel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Devon Samrah", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Devon Samrah all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Evan Pyfrom", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Evan Pyfrom all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jane Contact", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jane Contact all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chuck Farley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chuck Farley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Leif Arguin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Leif Arguin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Owen Sparacino", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Owen Sparacino all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lynn Saulsberry", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lynn Saulsberry all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Erica Eyrich", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Erica Eyrich all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brice Hedglin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brice Hedglin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Socorro Balandran", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Socorro Balandran all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mac Marksberry", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mac Marksberry all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Danny Dales", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Danny Dales all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Naomi Greenly", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Naomi Greenly all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Vernon Engelman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Vernon Engelman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Inventory Admin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Inventory Admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marcie Shulz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marcie Shulz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tyree Courrege", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tyree Courrege all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tricia Kruss", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tricia Kruss all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cristopher Wiget", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cristopher Wiget all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Teodoro Gaboury", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Teodoro Gaboury all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Vernice Resendes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Vernice Resendes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Adela Cervantsz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Adela Cervantsz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "WM InitiatorQualifier", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign WM InitiatorQualifier all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bryant Bouliouris", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bryant Bouliouris all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Forest Orea", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Forest Orea all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marta Hoch", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marta Hoch all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Madonna Cosby", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Madonna Cosby all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alyssa Biasotti", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alyssa Biasotti all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marscha Gilles-Piecukonis", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marscha Gilles-Piecukonis all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reggie Streu", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reggie Streu all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rebekah Lindboe", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rebekah Lindboe all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dollie Pillitteri", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dollie Pillitteri all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Praveen Vootkuri", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Praveen Vootkuri all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ashley Leonesio", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ashley Leonesio all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Barton Friesner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Barton Friesner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Thomas Pfeifer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Thomas Pfeifer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carol Coughlin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carol Coughlin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tommie Reuland", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tommie Reuland all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Suresh Yekollu", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Suresh Yekollu all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Henrietta Cintora", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Henrietta Cintora all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Latisha Bahls", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Latisha Bahls all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alejandra Prenatt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alejandra Prenatt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alejandro Mascall", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alejandro Mascall all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alex Ray", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alex Ray all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Leslie Cackowski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Leslie Cackowski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Peter Partner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Peter Partner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Avery Parbol", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Avery Parbol all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dwayne Maddalena", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dwayne Maddalena all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bart Hachey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bart Hachey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Donald Sherretts", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Donald Sherretts all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bruno Nancy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bruno Nancy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ricky Tom", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ricky Tom all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lucien Iurato", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lucien Iurato all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Allie Pumphrey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Allie Pumphrey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eddie Gauer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eddie Gauer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "WM Approver", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign WM Approver all of the \"sn_incident\" roles" + }, + { + "user_full_name": "ESC Admin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign ESC Admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Isaac Zackery", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Isaac Zackery all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ted Keppel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ted Keppel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rita Center", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rita Center all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Helena Suermann", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Helena Suermann all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Fannie Steese", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Fannie Steese all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Laurie Bibbs", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Laurie Bibbs all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gaston Cieloszyk", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gaston Cieloszyk all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lamar Mckibben", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lamar Mckibben all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Roman Simone", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Roman Simone all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Joel Nardo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Joel Nardo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sadie Rowlett", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sadie Rowlett all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lane Brantz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lane Brantz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Benchmark Scheduler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Benchmark Scheduler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lona Scronce", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lona Scronce all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Keisha Ransonet", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Keisha Ransonet all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Annabelle Coger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Annabelle Coger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Annette Frietas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Annette Frietas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ruthie Zortman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ruthie Zortman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ed Gompf", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ed Gompf all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gayla Geimer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gayla Geimer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Asaf Ary", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Asaf Ary all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Amos Linnan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Amos Linnan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bradly Hasselvander", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bradly Hasselvander all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Essie Vaill", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Essie Vaill all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Angelique Schermerhorn", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Angelique Schermerhorn all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Virtual Agent", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Virtual Agent all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Guest", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Guest all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Vivian Brzostowski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Vivian Brzostowski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Karyn Jinks", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Karyn Jinks all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Asset Manager", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Asset Manager all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Clarice Knower", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Clarice Knower all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Warren Speach", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Warren Speach all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reva Bayer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reva Bayer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Karen Zombo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Karen Zombo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Allyson Gillispie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Allyson Gillispie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Harding Asher", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Harding Asher all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Elisa Gracely", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Elisa Gracely all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Claudio Loose", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Claudio Loose all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Guillermo Tsang", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Guillermo Tsang all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Charlie White", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Charlie White all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Caitlin Reiniger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Caitlin Reiniger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lyndon Bellerdine", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lyndon Bellerdine all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kurtis Asberry", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kurtis Asberry all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marshall Hutch", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marshall Hutch all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Justina Dragaj", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Justina Dragaj all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reginald Lunan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reginald Lunan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robin Grotz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robin Grotz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Andrew Chen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Andrew Chen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brandon Beckman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brandon Beckman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Denice Nordlinger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Denice Nordlinger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marta Warran", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marta Warran all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eli Bettner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eli Bettner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Luella Pliner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Luella Pliner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Maynard Kaewprasert", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Maynard Kaewprasert all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Maryann Garnette", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Maryann Garnette all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Merle Wyrosdick", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Merle Wyrosdick all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Andrew Jackson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Andrew Jackson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brian Kiely", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brian Kiely all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tia Neumaier", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tia Neumaier all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Bohnhamn", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Bohnhamn all of the \"sn_incident\" roles" + }, + { + "user_full_name": "George Warren", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign George Warren all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Garfield Lijewski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Garfield Lijewski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mari Hwang", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mari Hwang all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sam Sorokin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sam Sorokin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mike Rogers", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mike Rogers all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bridget Knightly", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bridget Knightly all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dionne Borycz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dionne Borycz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bertie Luby", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bertie Luby all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Delphine Helmich", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Delphine Helmich all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Judy Gartenmayer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Judy Gartenmayer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chad Araiza", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chad Araiza all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ramon Amaral", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ramon Amaral all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mariano Maury", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mariano Maury all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robin Schartz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robin Schartz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lacy Hyten", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lacy Hyten all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tia Lino", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tia Lino all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hilario Cassa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hilario Cassa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Emily Jason", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Emily Jason all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gracie Ehn", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gracie Ehn all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Denise Speegle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Denise Speegle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kevin Edd", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kevin Edd all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Natasha Ingram", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Natasha Ingram all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Deshawn Inafuku", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Deshawn Inafuku all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Colin Altonen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Colin Altonen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marcelo Arostegui", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marcelo Arostegui all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Abraham Lincoln", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Abraham Lincoln all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Miranda Hammitt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Miranda Hammitt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Antione Mccleary", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Antione Mccleary all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Winnie Reich", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Winnie Reich all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Vanessa Lewallen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Vanessa Lewallen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Wilmer Constantineau", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Wilmer Constantineau all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Heath Vanalphen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Heath Vanalphen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Michelle Semmler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Michelle Semmler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Thomas Jefferson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Thomas Jefferson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nathanial Phoenix", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nathanial Phoenix all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Morton Crummell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Morton Crummell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Credential Admin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Credential Admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rena Griffeth", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rena Griffeth all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sharlene Circelli", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sharlene Circelli all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Savannah Loffier", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Savannah Loffier all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hans Fischer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hans Fischer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "James Vittolo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign James Vittolo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Don Mestler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Don Mestler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "SOAP Guest", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign SOAP Guest all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cindy Lisa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cindy Lisa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cyril Behen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cyril Behen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dennis Millar", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dennis Millar all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ronald Hawes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ronald Hawes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ingrid Blake", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ingrid Blake all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Vince Ettel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Vince Ettel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Christian Marnell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Christian Marnell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lashonda Derouen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lashonda Derouen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cathryn Nicolaus", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cathryn Nicolaus all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Waldo Edberg", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Waldo Edberg all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kurtis Mcbay", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kurtis Mcbay all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Saundra Mcaulay", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Saundra Mcaulay all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jonathon Waldall", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jonathon Waldall all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Margarito Kornbau", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Margarito Kornbau all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ross Spurger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ross Spurger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chase Furler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chase Furler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Billie Cowley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Billie Cowley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jimmy Hrobsky", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jimmy Hrobsky all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marianne Earman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marianne Earman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lacy Belmont", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lacy Belmont all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Miquel Demicco", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Miquel Demicco all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Willard Roughen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Willard Roughen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Darrel Ruffins", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Darrel Ruffins all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Annie Approver", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Annie Approver all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Pilar Suddeth", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Pilar Suddeth all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Davis Heideman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Davis Heideman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sheila Holloran", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sheila Holloran all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Fran Zanders", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Fran Zanders all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Darren Merlin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Darren Merlin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Edgardo Prudente", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Edgardo Prudente all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Garth Skiffington", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Garth Skiffington all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Deepa Shah", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Deepa Shah all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Van Leanen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Van Leanen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tyron Quillman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tyron Quillman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Josephine Sotlar", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Josephine Sotlar all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tisha Gorder", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tisha Gorder all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bridgett Retort", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bridgett Retort all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Katina Ramano", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Katina Ramano all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marta Horner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marta Horner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Peggy Hohlstein", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Peggy Hohlstein all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jodi Seals", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jodi Seals all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Derek Kreutzbender", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Derek Kreutzbender all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kay Ganguli", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kay Ganguli all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cameron Richard", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cameron Richard all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reva Lecates", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reva Lecates all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Denis Koch", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Denis Koch all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Service Desk", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Service Desk all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Charles Beckley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Charles Beckley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gregg Guevarra", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gregg Guevarra all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jim Matthews", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jim Matthews all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jarrett Kenzie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jarrett Kenzie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Veronica Radman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Veronica Radman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Amelia Caputo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Amelia Caputo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Titus Rodreguez", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Titus Rodreguez all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kris Persson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kris Persson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tamara Declue", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tamara Declue all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marquita Bousman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marquita Bousman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Meredith Ivrin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Meredith Ivrin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bruno Smith", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bruno Smith all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hans Carlan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hans Carlan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Oma Duffy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Oma Duffy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jason Roy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jason Roy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Armando Papik", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Armando Papik all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robert Thomson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robert Thomson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Shelley Groden", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Shelley Groden all of the \"sn_incident\" roles" + }, + { + "user_full_name": "ml_report.user ", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign ml_report.user all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bette Barcelona", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bette Barcelona all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Isabell Armout", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Isabell Armout all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Romeo Lisac", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Romeo Lisac all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sue Haakinson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sue Haakinson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alene Rabeck", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alene Rabeck all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Benjamin Schkade", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Benjamin Schkade all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jasmin Gum", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jasmin Gum all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mara Rineheart", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mara Rineheart all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Emilia Oxley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Emilia Oxley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ray William", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ray William all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Wayne Webb", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Wayne Webb all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Maurine Monroy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Maurine Monroy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mandy Mcdonnell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mandy Mcdonnell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Simone Lundie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Simone Lundie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brian White", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brian White all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Margaret Grey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Margaret Grey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Curt Menedez", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Curt Menedez all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Linda Cox", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Linda Cox all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Johnie Minaai", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Johnie Minaai all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Problem Task Analyst B", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Problem Task Analyst B all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sabrina Deppert", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sabrina Deppert all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brenda Thomson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brenda Thomson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Devon Teston", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Devon Teston all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Callie Leboeuf", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Callie Leboeuf all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Barbara Hindley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Barbara Hindley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Kennedy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Kennedy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Henry Carter", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Henry Carter all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Luciano Truiolo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Luciano Truiolo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jimmie Barninger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jimmie Barninger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mike Hussey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mike Hussey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Boris Catino", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Boris Catino all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Jason", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Jason all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosanna Sandrock", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosanna Sandrock all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mitchel Harnar", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mitchel Harnar all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kennith Kirklin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kennith Kirklin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kasey Nguyen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kasey Nguyen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Berta Karczewski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Berta Karczewski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Claire Moyerman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Claire Moyerman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lana Garrigus", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lana Garrigus all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Leif Bachta", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Leif Bachta all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cherie Fuhri", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cherie Fuhri all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alissa Mountjoy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alissa Mountjoy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Felecia Riedl", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Felecia Riedl all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Antonius Bullach", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Antonius Bullach all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jude Haza", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jude Haza all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Daniel Kraig", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Daniel Kraig all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Joe Martin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Joe Martin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Georgette Bandyk", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Georgette Bandyk all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ike Benthin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ike Benthin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carol Krisman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carol Krisman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "WM Agent", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign WM Agent all of the \"sn_incident\" roles" + }, + { + "user_full_name": "George Tukis", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign George Tukis all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Megan Burke", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Megan Burke all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Judi Kivel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Judi Kivel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lucius Winchester", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lucius Winchester all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dorothea Sweem", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dorothea Sweem all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lana Keels", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lana Keels all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Maryanne Whyman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Maryanne Whyman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ofelia Sheffler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ofelia Sheffler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mara Vanderzwaag", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mara Vanderzwaag all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mamie Mcintee", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mamie Mcintee all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Terrance Nimmer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Terrance Nimmer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Taylor Fogerty", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Taylor Fogerty all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Michael Hoefer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Michael Hoefer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Taylor Vreeland", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Taylor Vreeland all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Valentine Granberry", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Valentine Granberry all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Melvin Auteri", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Melvin Auteri all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Prince Kauk", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Prince Kauk all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Candice Bruckman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Candice Bruckman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kenya Bruni", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kenya Bruni all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Julie Lewis", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Julie Lewis all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Adams", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Adams all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kris Stanzak", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kris Stanzak all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ted Bozelle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ted Bozelle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Elmo Dagenais", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Elmo Dagenais all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Waldo Sisk", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Waldo Sisk all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Val Oborne", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Val Oborne all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Damion Matkin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Damion Matkin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Shanna Neundorfer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Shanna Neundorfer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cruz Roudabush", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cruz Roudabush all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Melody Saddat", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Melody Saddat all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carmel Overfelt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carmel Overfelt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gale Nolau", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gale Nolau all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Stephen Seiters", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Stephen Seiters all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sheryl Sisofo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sheryl Sisofo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Olga Yarovenko", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Olga Yarovenko all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lynda Caraway", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lynda Caraway all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Warren Hacher", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Warren Hacher all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Timothy Janski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Timothy Janski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Karla Ken", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Karla Ken all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lucas Santellana", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lucas Santellana all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kathleen Beresnyak", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kathleen Beresnyak all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sherwood Detillier", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sherwood Detillier all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Katina Survant", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Katina Survant all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Coleman Cuneo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Coleman Cuneo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Trey Tout", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Trey Tout all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Frankie Morein", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Frankie Morein all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Diana Temple", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Diana Temple all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Veronica Achorn", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Veronica Achorn all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Modesto Scroggie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Modesto Scroggie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Junior Wadlinger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Junior Wadlinger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Willa Dutt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Willa Dutt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Burton Brining", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Burton Brining all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Renae Eldrige", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Renae Eldrige all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ray Srock", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ray Srock all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alva Pennigton", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alva Pennigton all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Denver Topete", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Denver Topete all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rene Dummermuth", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rene Dummermuth all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reina Reisenauer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reina Reisenauer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kathie Argenti", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kathie Argenti all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Daniel Zill", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Daniel Zill all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Audra Cantu", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Audra Cantu all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rebeca Brumet", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rebeca Brumet all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Heath Vazquez", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Heath Vazquez all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nickolas Khosravi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nickolas Khosravi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lina Hybarger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lina Hybarger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Francis Soo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Francis Soo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Roxie Varenhorst", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Roxie Varenhorst all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jarvis Galas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jarvis Galas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carla Sirbaugh", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carla Sirbaugh all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Millicent Ekstrom", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Millicent Ekstrom all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Approver User", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Approver User all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Elvira Blumenthal", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Elvira Blumenthal all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Terrell Rodda", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Terrell Rodda all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Edward Smith", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Edward Smith all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Maryjane Arata", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Maryjane Arata all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nadia Wilshire", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nadia Wilshire all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Naomi Caetano", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Naomi Caetano all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Wes Fontanella", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Wes Fontanella all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gilly Parker", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gilly Parker all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Theron Hambright", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Theron Hambright all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rebekah Padley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rebekah Padley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marietta Bjornberg", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marietta Bjornberg all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Fred Kunde", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Fred Kunde all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mary Cruse", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mary Cruse all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Anthony Roy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Anthony Roy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lashonda Enote", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lashonda Enote all of the \"sn_incident\" roles" + }, + { + "user_full_name": "George Washington", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign George Washington all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dwain Agricola", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dwain Agricola all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reina Wolchesky", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reina Wolchesky all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robecca William", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robecca William all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Fabian Mcshaw", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Fabian Mcshaw all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hanna Cinkan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hanna Cinkan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Steve Schorr", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Steve Schorr all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Paul Ryan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Paul Ryan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Virgil Chinni", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Virgil Chinni all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chi Greenlaw", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chi Greenlaw all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Logan Muhl", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Logan Muhl all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Neil Backus", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Neil Backus all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ned Stark", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ned Stark all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Efren Baucher", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Efren Baucher all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Valeria Lingbeek", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Valeria Lingbeek all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Isaac Davensizer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Isaac Davensizer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Suzette Devaughan", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Suzette Devaughan all of the \"sn_incident\" roles" + }, + { + "user_full_name": "boaz shamami", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign boaz shamami all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sal Pindell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sal Pindell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Yvette Kokoska", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Yvette Kokoska all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cristina Sharper", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cristina Sharper all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Manuel Dienhart", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Manuel Dienhart all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lacy Woodfin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lacy Woodfin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mabel Weeden", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mabel Weeden all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jacklyn Emayo", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jacklyn Emayo all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hillary Holmes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hillary Holmes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kylie Bridgeman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kylie Bridgeman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Pamala Brodtmann", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Pamala Brodtmann all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marisa Smiler", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marisa Smiler all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Retak", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Retak all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Heriberto Tivis", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Heriberto Tivis all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carla Humble", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carla Humble all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cindy Contact", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cindy Contact all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Password User", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Password User all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Traci Toomey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Traci Toomey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alexlongnamealexlongnamealexlongname Raylongnameraylongnameraylongnameraylongname", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alexlongnamealexlongnamealexlongname Raylongnameraylongnameraylongnameraylongname all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marc Wanger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marc Wanger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lyman Whittley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lyman Whittley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cary Mccamey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cary Mccamey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jerrod Bennett", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jerrod Bennett all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Roseann Jerko", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Roseann Jerko all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosalia Kennemur", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosalia Kennemur all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Fausto Marks", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Fausto Marks all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mark Johnson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mark Johnson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rodrigo Wildrick", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rodrigo Wildrick all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Craig Parker", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Craig Parker all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Security Center Data Collection User", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Security Center Data Collection User all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Deanna Gerbi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Deanna Gerbi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alex McGibbon", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alex McGibbon all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mildred Gallegas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mildred Gallegas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Cherie Schronce", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Cherie Schronce all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Petra Clemmens", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Petra Clemmens all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dwain Cuttitta", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dwain Cuttitta all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Freida Michelfelder", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Freida Michelfelder all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosalie Krigger", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosalie Krigger all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Felipe Mahone", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Felipe Mahone all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Nelly Jakuboski", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Nelly Jakuboski all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Norman Betance", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Norman Betance all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jamie Erwin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jamie Erwin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Travis Brockert", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Travis Brockert all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Phil Hendrie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Phil Hendrie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eldon Sutch", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eldon Sutch all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Emery Reek", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Emery Reek all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Athena Fontanilla", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Athena Fontanilla all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kristine Paker", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kristine Paker all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lucius Bagnoli", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lucius Bagnoli all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lesa Chantry", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lesa Chantry all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Doreen Sakurai", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Doreen Sakurai all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ashley Parker", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ashley Parker all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dollie Daquino", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dollie Daquino all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Edwin Forman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Edwin Forman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Concetta Sarchett", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Concetta Sarchett all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Billie Tinnes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Billie Tinnes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eliseo Wice", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eliseo Wice all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Borris Becker", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Borris Becker all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Raphael Bickel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Raphael Bickel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Gisela Kosicki", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Gisela Kosicki all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Elmo Gabouer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Elmo Gabouer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jeanie Dalen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jeanie Dalen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Caleb Hall", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Caleb Hall all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lizzie Torregrossa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lizzie Torregrossa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Patty Bernasconi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Patty Bernasconi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Quintin Isacson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Quintin Isacson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Joe Employee", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Joe Employee all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jeremy Lampi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jeremy Lampi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Teddy Taylor", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Teddy Taylor all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mitzi Ihenyen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mitzi Ihenyen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Shanna Numkena", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Shanna Numkena all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Pat Hoshaw", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Pat Hoshaw all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brendan Qin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brendan Qin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brian Duke", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brian Duke all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Naomi Mcraven", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Naomi Mcraven all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Chris Harris", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Chris Harris all of the \"sn_incident\" roles" + }, + { + "user_full_name": "John Chipley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign John Chipley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jannie Bowditch", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jannie Bowditch all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eva Seahorn", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eva Seahorn all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ike Zeolla", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ike Zeolla all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Minh Leclare", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Minh Leclare all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Neva Marsell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Neva Marsell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Elaine Renzi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Elaine Renzi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bess Marso", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bess Marso all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Deandre Resendiz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Deandre Resendiz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Terra Plagge", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Terra Plagge all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Julius Reyes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Julius Reyes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Trudy Worlds", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Trudy Worlds all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosemarie Fifield", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosemarie Fifield all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jimmie Hardgrove", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jimmie Hardgrove all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Hannah Facio", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Hannah Facio all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Courtney Shishido", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Courtney Shishido all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tommy Gore", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tommy Gore all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rosalind Krenzke", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rosalind Krenzke all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Viola Mcsorley", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Viola Mcsorley all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Davis Brevard", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Davis Brevard all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Angelo Ferentz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Angelo Ferentz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rob Phillips", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rob Phillips all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Karen Flierl", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Karen Flierl all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Miles Dyson", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Miles Dyson all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mitch Schattner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mitch Schattner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brian Samul", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brian Samul all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Celia Slavin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Celia Slavin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bryan Rovell", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bryan Rovell all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Faiza Ramos", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Faiza Ramos all of the \"sn_incident\" roles" + }, + { + "user_full_name": "William Mahmud", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign William Mahmud all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Problem Task Analyst A", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Problem Task Analyst A all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tori Villaescusa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tori Villaescusa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "User 1", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign User 1 all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Amy Chen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Amy Chen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mona Lisa", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mona Lisa all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marcelino Maggs", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marcelino Maggs all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dorthy Alexy", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dorthy Alexy all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Milton Kuhlman", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Milton Kuhlman all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Antonio Bencum", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Antonio Bencum all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Roger Rasmussen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Roger Rasmussen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Zackary Mockus", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Zackary Mockus all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Allan Schwantd", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Allan Schwantd all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Reginald Humes", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Reginald Humes all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Felipe Gould", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Felipe Gould all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alex Linde", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alex Linde all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Geri Forness", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Geri Forness all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Roger Seid", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Roger Seid all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Darrell Amrich", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Darrell Amrich all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marion Gaulden", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marion Gaulden all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Melissa Pena", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Melissa Pena all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Eduardo Bellendir", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Eduardo Bellendir all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Edwin Lavelli", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Edwin Lavelli all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Johnnie Rheaves", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Johnnie Rheaves all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Tammie Schwartzwalde", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Tammie Schwartzwalde all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Teri Erlewine", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Teri Erlewine all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Genevieve Kekiwi", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Genevieve Kekiwi all of the \"sn_incident\" roles" + }, + { + "user_full_name": "WM Dispatcher", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign WM Dispatcher all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Ione Kucera", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Ione Kucera all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marla Folz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marla Folz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Helene Iberg", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Helene Iberg all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Scott Seixas", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Scott Seixas all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Buster Wubbel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Buster Wubbel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rudy Kuhle", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rudy Kuhle all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bob Leno", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bob Leno all of the \"sn_incident\" roles" + }, + { + "user_full_name": "ml.admin ", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign ml.admin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robbie Deshay", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robbie Deshay all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carolina Kinlaw", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carolina Kinlaw all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Mary Maurizio", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Mary Maurizio all of the \"sn_incident\" roles" + }, + { + "user_full_name": "George Grey", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign George Grey all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Freeman Soula", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Freeman Soula all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Lynette Setlock", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Lynette Setlock all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rolando Baumann", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rolando Baumann all of the \"sn_incident\" roles" + }, + { + "user_full_name": "WM InitiatorQualifierDispatcher", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign WM InitiatorQualifierDispatcher all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brant Darnel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brant Darnel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Darrin Neiss", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Darrin Neiss all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Margot Arenburg", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Margot Arenburg all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Christa Bodenschatz", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Christa Bodenschatz all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Marisa Woldridge", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Marisa Woldridge all of the \"sn_incident\" roles" + }, + { + "user_full_name": "David Miller", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign David Miller all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Rachel Larrison", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Rachel Larrison all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Jeri Farstvedt", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Jeri Farstvedt all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sophie Langner", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sophie Langner all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Randal Gansen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Randal Gansen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Kyle Ferri", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Kyle Ferri all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Byron Fortuna", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Byron Fortuna all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Emilio Lampkin", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Emilio Lampkin all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Dude Lewbowskie", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Dude Lewbowskie all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Brent Vaidya", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Brent Vaidya all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Sitemap Scheduler User ", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Sitemap Scheduler User all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Carl Customer", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Carl Customer all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Robyn Christophel", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Robyn Christophel all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Aileen Mottern", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Aileen Mottern all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Amy Arquette", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Amy Arquette all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Software Manager", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Software Manager all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Alfonso Griglen", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Alfonso Griglen all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Edward Hack", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Edward Hack all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Krystle Stika", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Krystle Stika all of the \"sn_incident\" roles" + }, + { + "user_full_name": "System Administrator", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign System Administrator all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Bertram Quertermous", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Bertram Quertermous all of the \"sn_incident\" roles" + }, + { + "user_full_name": "Charlie Brown", + "role_family": "sn_incident", + "roles": "sn_incident_read, sn_incident_write, sn_incident_task_assigned_user, sn_incident_comments_write", + "goal": "Assign Charlie Brown all of the \"sn_incident\" roles" } ] \ No newline at end of file From f018f0db450760b0ebf558441b0d8502743154e0 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Sun, 14 Dec 2025 21:09:01 +0000 Subject: [PATCH 50/56] fix validator for iphone ordering when replacement is 'yes' --- src/browsergym/workarena/tasks/service_catalog.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index c5c9e94..6e1973d 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -754,9 +754,11 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str if requested_item["options"][self.FIELD_NAME_MAPPING["replacement"]] != self.config["replacement"]: return 0, False, "", {"message": "The requested replacement status is incorrect."} - # TODO: add replacement phone number in data - if requested_item["options"][self.FIELD_NAME_MAPPING["original_phone_number"]] != self.config["original_phone_number"]: - return 0, False, "", {"message": "The requested original phone number is incorrect."} + if self.config["replacement"].lower() == "yes": + entered_phone_number = ''.join(filter(str.isdigit, requested_item["options"][self.FIELD_NAME_MAPPING["original_phone_number"]])) + ground_truth_phone_number = ''.join(filter(str.isdigit, self.config["original_phone_number"])) + if entered_phone_number != ground_truth_phone_number: + return 0, False, "", {"message": "The requested original phone number is incorrect."} if requested_item["options"][self.FIELD_NAME_MAPPING["color"]] != self.COLOR_MAPPING[self.config["color"]]: # TODO: display color and config color is not the same From fe71de643a3a8bfe1895d67829c3ad5b2b628af8 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Mon, 15 Dec 2025 13:49:58 +0000 Subject: [PATCH 51/56] fix teardown for close_case --- src/browsergym/workarena/tasks/case.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/browsergym/workarena/tasks/case.py b/src/browsergym/workarena/tasks/case.py index b1b405d..fac2050 100644 --- a/src/browsergym/workarena/tasks/case.py +++ b/src/browsergym/workarena/tasks/case.py @@ -118,17 +118,13 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> def teardown(self) -> None: # revert the state to initial_state - table_api_call( - instance=self.instance, - table="sn_customerservice_case", - method="POST", - data={ - "state": self.initial_state, - }, - params={ - "sysparm_query": f"number={self.config['case_number']}", - "sysparm_fields": "state", - "sysparm_limit": 1, + requests.patch( + f"{self.instance.snow_url}/api/now/table/sn_customerservice_case/{self.record_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ + "resolution_code": self.initial_state, + "close_notes": "", }, ) From c21d5196bb60fc165906f7aa01d1eeda8c1394e2 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Mon, 15 Dec 2025 14:33:54 +0000 Subject: [PATCH 52/56] fix resolve incident teardown function --- src/browsergym/workarena/tasks/incident.py | 23 ++++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/browsergym/workarena/tasks/incident.py b/src/browsergym/workarena/tasks/incident.py index 79d8e10..7d857b0 100644 --- a/src/browsergym/workarena/tasks/incident.py +++ b/src/browsergym/workarena/tasks/incident.py @@ -270,9 +270,9 @@ class ResolveIncidentTask(ServiceNowIncidentTask): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.initial_incident_close_code = self._get_initial_incident_close_code() + self._get_initial_incident_info() - def _get_initial_incident_close_code(self): + def _get_initial_incident_info(self): incident_number = self.config["incident_number"] @@ -291,8 +291,8 @@ def _get_initial_incident_close_code(self): if not result: raise ValueError(f"Incident {incident_number} not found") - return result[0]["close_code"] - + self.incident_sys_id = result[0]["sys_id"] + self.initial_incident_close_code = result[0]["close_code"] def all_configs(self): return json.load(open(RESOLVE_INCIDENT_CONFIG_PATH)) @@ -352,17 +352,14 @@ def teardown(self) -> None: # reset the close code to the initial value if self.initial_incident_close_code is not None and self.config["close_code"] != self.initial_incident_close_code: try: - table_api_call( - instance=self.instance, - table="incident", - params={ - "sysparm_query": f"number={self.config['incident_number']}", - }, - data={ + requests.patch( + f"{self.instance.snow_url}/api/now/table/incident/{self.incident_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ "close_code": self.initial_incident_close_code, - "close_notes": "", # empty close notes + "close_notes": "", }, - method="PUT", ) except HTTPError: # sys_id was stored in local storage (for submitted) From f234d58c717be8d45020df1904e18461e1462aa4 Mon Sep 17 00:00:00 2001 From: Orlando Marquez Date: Mon, 15 Dec 2025 12:09:29 -0500 Subject: [PATCH 53/56] remove call to _get_form as it causes issues in workspace forms --- .../workarena/tasks/form_workspace.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/browsergym/workarena/tasks/form_workspace.py b/src/browsergym/workarena/tasks/form_workspace.py index e74039b..8bccf1e 100644 --- a/src/browsergym/workarena/tasks/form_workspace.py +++ b/src/browsergym/workarena/tasks/form_workspace.py @@ -63,6 +63,20 @@ def setup_goal(self, page: Page) -> tuple[str, dict]: return goal, info + def start(self, page: Page) -> None: + # Overriding start because calling self._get_form(page) in the parent class gives an error + logging.debug("Navigating to task start page") + + # Authenticate + url_login( + instance=self.instance, + page=page, + ) + + # Navigate to the task's url + page.goto(self.start_url) + self._wait_for_ready(page) + def validate( self, page: Page, chat_messages: list[str] ) -> Tuple[float, bool, str, dict]: @@ -237,20 +251,6 @@ def __init__(self, seed: int = None, self.start_url = self.instance.snow_url self.created_sys_id = None - def start(self, page: Page) -> None: - # Overriding start because calling self._get_form(page) in the parent class gives an error - logging.debug("Navigating to task start page") - - # Authenticate - url_login( - instance=self.instance, - page=page, - ) - - # Navigate to the task's url - page.goto(self.start_url) - self._wait_for_ready(page) - def get_init_scripts(self) -> List[str]: # Override this to avoid changing functionality of submit button return [] From fb0b77cfa8171091fd983cc93fece48e13b78c19 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Tue, 16 Dec 2025 00:14:02 +0000 Subject: [PATCH 54/56] changes to validators and data files for various tasks --- src/browsergym/workarena/__init__.py | 2 + src/browsergym/workarena/config.py | 6 + .../task_configs/create_user_group.json | 23 +++ .../create_user_group_add_users.json | 20 +++ .../task_configs/order_reset_password.json | 10 +- .../workarena/tasks/change_request.py | 14 +- src/browsergym/workarena/tasks/incident.py | 17 +- src/browsergym/workarena/tasks/navigation.py | 23 +++ src/browsergym/workarena/tasks/ritm.py | 35 ++-- .../workarena/tasks/service_catalog.py | 38 ++-- src/browsergym/workarena/tasks/user_group.py | 164 ++++++++++++++++-- 11 files changed, 273 insertions(+), 79 deletions(-) create mode 100644 src/browsergym/workarena/data_files/task_configs/create_user_group.json create mode 100644 src/browsergym/workarena/data_files/task_configs/create_user_group_add_users.json diff --git a/src/browsergym/workarena/__init__.py b/src/browsergym/workarena/__init__.py index 73aa721..21edf47 100644 --- a/src/browsergym/workarena/__init__.py +++ b/src/browsergym/workarena/__init__.py @@ -35,6 +35,7 @@ from .tasks.incident import __TASKS__ as INCIDENT_TASKS from .tasks.license import __TASKS__ as LICENSE_TASKS from .tasks.ritm import __TASKS__ as RITM_TASKS +from .tasks.user_group import __TASKS__ as USER_GROUP_TASKS from .tasks.compositional.base import CompositionalTask ALL_WORKARENA_TASKS = [ @@ -68,6 +69,7 @@ *LICENSE_TASKS, *RITM_TASKS, *FORM_WORKSPACE_TASKS, + *USER_GROUP_TASKS, ] diff --git a/src/browsergym/workarena/config.py b/src/browsergym/workarena/config.py index 6851db6..11faade 100644 --- a/src/browsergym/workarena/config.py +++ b/src/browsergym/workarena/config.py @@ -304,6 +304,12 @@ DEACTIVATE_USER_GROUP_CONFIG_PATH = str( resources.files(data_files).joinpath("task_configs/deactivate_user_group.json") ) +CREATE_USER_GROUP_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/create_user_group.json") +) +CREATE_USER_GROUP_ADD_USERS_CONFIG_PATH = str( + resources.files(data_files).joinpath("task_configs/create_user_group_add_users.json") +) # service catalog tasks (dynamic guidance) ORDER_IPHONE_TASK_CONFIG_PATH = str( diff --git a/src/browsergym/workarena/data_files/task_configs/create_user_group.json b/src/browsergym/workarena/data_files/task_configs/create_user_group.json new file mode 100644 index 0000000..0e55ad6 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_user_group.json @@ -0,0 +1,23 @@ +[ + { + "name": "ITIL User Group", + "manager": "Pierre Salera", + "type": "itil", + "roles": "itil", + "goal": "Create an active user group named \"ITIL User Group\". Its manager is Pierre Salera, type is itil, and roles include itil" + }, + { + "name": "Survey Admins", + "manager": "Alene Rabeck", + "type": "survey", + "roles": "survey_admin", + "goal": "Create an active user group named \"Survey Admins\". Its manager is Alene Rabeck, type is survey, and roles include survey_admin" + }, + { + "name": "Catalog Managers", + "manager": "Zachary Mockus", + "type": "catalog", + "roles": "catalog_manager", + "goal": "Create an active user group named \"Catalog Managers\". Its manager is Zachary Mockus, type is catalog, and roles include catalog_manager" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/create_user_group_add_users.json b/src/browsergym/workarena/data_files/task_configs/create_user_group_add_users.json new file mode 100644 index 0000000..107b3b0 --- /dev/null +++ b/src/browsergym/workarena/data_files/task_configs/create_user_group_add_users.json @@ -0,0 +1,20 @@ +[ + { + "name": "NYC Coed Soccer", + "description": "We play at the Parade Grounds on Saturdays at 10", + "members": "Chad Araiza, Eva Seahorn, Floyd Veazey", + "goal": "Create an active user group with the name \"NYC Coed Soccer\" and description \"We play at the Parade Grounds on Saturdays at 10\". Add Chad Araiza, Eva Seahorn, Floyd Veazey to the group" + }, + { + "name": "NYC Run Club", + "description": "We run Monday mornings at 7", + "members": "Chad Araiza, Eva Seahorn, Floyd Veazey", + "goal": "Create an active user group with the name \"NYC Run Club\" and description \"We run Monday mornings at 7\". Add Chad Araiza, Eva Seahorn, Floyd Veazey to the group" + }, + { + "name": "NYC Happy Hour Group", + "description": "We get together for happy hour on Thursdays at 4", + "members": "Chad Araiza, Eva Seahorn, Floyd Veazey", + "goal": "Create an active user group with the name \"NYC Happy Hour Group\" and description \"We get together for happy hour on Thursdays at 4\". Add Chad Araiza, Eva Seahorn, Floyd Veazey to the group" + } +] \ No newline at end of file diff --git a/src/browsergym/workarena/data_files/task_configs/order_reset_password.json b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json index 3a8e179..a9e1741 100644 --- a/src/browsergym/workarena/data_files/task_configs/order_reset_password.json +++ b/src/browsergym/workarena/data_files/task_configs/order_reset_password.json @@ -1,31 +1,31 @@ [ { "item": "SAP Payroll", - "contact": "Email", + "contact": "email", "quantity": 1, "goal": "Help me reset my password for SAP Payroll by submitting a request through the Service Catalog. Send the reset instructions to Email." }, { "item": "PeopleSoft CRM", - "contact": "Telephone", + "contact": "phone", "quantity": 1, "goal": "Help me reset my password for PeopleSoft CRM by submitting a request through the Service Catalog. Send the reset instructions to Telephone." }, { "item": "Workday Enterprise Services", - "contact": "SMS", + "contact": "sms", "quantity": 1, "goal": "Help me reset my password for Workday Enterprise Services by submitting a request through the Service Catalog. Send the reset instructions to SMS." }, { "item": "Slack", - "contact": "Email", + "contact": "email", "quantity": 1, "goal": "Help me reset my password for Slack by submitting a request through the Service Catalog. Send the reset instructions to Email." }, { "item": "Windows Mobile", - "contact": "SMS", + "contact": "sms", "quantity": 1, "goal": "Help me reset my password for Windows Mobile by submitting a request through the Service Catalog. Send the reset instructions to SMS." } diff --git a/src/browsergym/workarena/tasks/change_request.py b/src/browsergym/workarena/tasks/change_request.py index 784ad80..bb0c929 100644 --- a/src/browsergym/workarena/tasks/change_request.py +++ b/src/browsergym/workarena/tasks/change_request.py @@ -123,15 +123,13 @@ def teardown(self) -> None: # revert the change request approver state to the initial state if self.change_request_approver_sys_id is not None: try: - table_api_call( - instance=self.instance, - table="sysapproval_approver", - params={ - "sysparm_query": f"sys_id={self.change_request_approver_sys_id}", - "sysparm_limit": 1, + requests.patch( + f"{self.instance.snow_url}/api/now/table/sysapproval_approver/{self.change_request_approver_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ + "state": self.initial_change_request_approver_state, }, - method="PUT", - data={"state": self.initial_change_request_approver_state}, ) except HTTPError: pass diff --git a/src/browsergym/workarena/tasks/incident.py b/src/browsergym/workarena/tasks/incident.py index 7d857b0..56f7af5 100644 --- a/src/browsergym/workarena/tasks/incident.py +++ b/src/browsergym/workarena/tasks/incident.py @@ -113,16 +113,13 @@ def teardown(self): # revert the additional_assignee_list to the initial value if self.initial_incident_additional_assignee_list is not None and self.config["additional_assignee_list"] != self.initial_incident_additional_assignee_list: try: - table_api_call( - instance=self.instance, - table="incident", - params={ - "sysparm_query": f"number={self.config['incident_number']}", - }, - data={ + requests.patch( + f"{self.instance.snow_url}/api/now/table/incident/{self.config['incident_number']}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ "additional_assignee_list": self.initial_incident_additional_assignee_list, }, - method="PUT", ) except HTTPError: pass @@ -282,7 +279,7 @@ def _get_initial_incident_info(self): headers={"Accept": "application/json"}, params={ "sysparm_query": f"number={incident_number}", - "sysparm_fields": "sys_id,number,close_code,close_notes", + "sysparm_fields": "sys_id,number,close_code,close_notes,state", "sysparm_limit": 1, }, ) @@ -292,6 +289,7 @@ def _get_initial_incident_info(self): raise ValueError(f"Incident {incident_number} not found") self.incident_sys_id = result[0]["sys_id"] + self.initial_incident_state = result[0]["state"] self.initial_incident_close_code = result[0]["close_code"] def all_configs(self): @@ -359,6 +357,7 @@ def teardown(self) -> None: json={ "close_code": self.initial_incident_close_code, "close_notes": "", + "state": self.initial_incident_state, }, ) except HTTPError: diff --git a/src/browsergym/workarena/tasks/navigation.py b/src/browsergym/workarena/tasks/navigation.py index c327e03..4336489 100644 --- a/src/browsergym/workarena/tasks/navigation.py +++ b/src/browsergym/workarena/tasks/navigation.py @@ -182,6 +182,29 @@ def get_pretty_printed_description(self) -> str: def cheat(self, page: Page, chat_messages: list[str]) -> None: pass + def validate( + self, page: playwright.sync_api.Page, chat_messages: list[str] + ) -> Tuple[float, bool, str, dict]: + # we're less strict on the validation here. + page.wait_for_load_state("domcontentloaded") + + # Get the current URL and the final URL + current_url = parse.urlunparse( + parse.urlparse(parse.unquote(page.evaluate("() => window.location.href"))) + ) + final_url_tmp = self.module.get("url", "INVALID") + final_url = parse.urlunparse(parse.urlparse(parse.unquote(final_url_tmp))) + + if final_url in current_url: + return ( + 1, + True, + "Nice work, thank you!", + {"message": "Correct module reached."}, + ) + + return 0, False, "", {"message": "Not at expected URL."} + class ImpersonationTask(AbstractServiceNowTask): """ Task to impersonate a user. diff --git a/src/browsergym/workarena/tasks/ritm.py b/src/browsergym/workarena/tasks/ritm.py index 06d8e58..aea239b 100644 --- a/src/browsergym/workarena/tasks/ritm.py +++ b/src/browsergym/workarena/tasks/ritm.py @@ -124,24 +124,18 @@ def teardown(self) -> None: # revert to previous state if self.initial_approval and self.initial_approval != self.config["approval"]: try: - table_api_call( - instance=self.instance, - table="sc_req_item", - params={ - "sysparm_query": f"number={self.config['ritm_number']}", - "sysparm_fields": "sys_id,number,approval", - "sysparm_limit": 1, - }, - data={ + requests.patch( + f"{self.instance.snow_url}/api/now/table/sc_req_item/{self.record_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ "approval": self.initial_approval, }, - method="PUT", ) except HTTPError: # sys_id was stored in local storage (for submitted) # but the record is absent from the database (probably invalid form) - pass - + pass class UpdateRitmQuantityTask(ServiceNowRitmTask): @@ -215,24 +209,19 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> def teardown(self) -> None: if self.initial_quantity and self.initial_quantity != self.config["quantity"]: try: - table_api_call( - instance=self.instance, - table="sc_req_item", - params={ - "sysparm_query": f"number={self.config['ritm_number']}", - "sysparm_fields": "sys_id,number,quantity", - "sysparm_limit": 1, - }, - data={ + requests.patch( + f"{self.instance.snow_url}/api/now/table/sc_req_item/{self.record_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ "quantity": self.initial_quantity, }, - method="PUT", ) except HTTPError: # sys_id was stored in local storage (for submitted) # but the record is absent from the database (probably invalid form) pass - + __TASKS__ = [ ChangeRitmStatusTask, UpdateRitmQuantityTask, diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 6e1973d..a36d847 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -739,10 +739,10 @@ class OrderIphoneTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -789,10 +789,10 @@ class OrderMobilePhoneTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -814,10 +814,10 @@ class OrderMiscHardwareTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -830,10 +830,10 @@ class OrderMiscHardwareWithBusinessJustificationTask(OrderFromServiceCatalogTask def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -859,10 +859,10 @@ class OrderPaperSuppliesTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -883,7 +883,7 @@ class OrderResetPasswordTask(OrderFromServiceCatalogTask): def _get_incident_sys_id(self, page: Page) -> str | None: # Retrieve the incident sysid from the URL current_url = parse.urlparse(parse.unquote(page.evaluate("() => window.location.href"))) - (self.incident_sysid,) = parse.parse_qs(current_url.query).get("sys_id", [None]) + self.incident_sysid = parse.parse_qs(current_url.query).get("sys_id", [None])[0] sleep(3) def _get_incident_short_description(self) -> str | None: @@ -937,9 +937,9 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str return 0, False, "", {"message": "The incident short description should end with the item name."} # sanity check work notes - if not f"System : {self.config['item']}" in incident_work_notes: + if not f"System : {self.config['item']}".lower() in incident_work_notes.lower(): return 0, False, "", {"message": "The incident work notes should contain the item name."} - if not f"Contact: {self.config['contact']}" in incident_work_notes: + if not f"Contact : {self.config['contact']}".lower() in incident_work_notes.lower(): return 0, False, "", {"message": "The incident work notes should contain the contact method."} return 1, True, "", {"message": "Task completed successfully."} @@ -989,10 +989,10 @@ def _get_location(self, location_sys_id: str): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -1024,10 +1024,10 @@ class OrderSoftwareTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} if not requested_item["cat_item"]["display_value"].lower() == self.config["item"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} @@ -1040,11 +1040,11 @@ class OrderSoftwareAccessTask(OrderFromServiceCatalogTask): def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str, dict]: requested_item = self._get_requested_item(page) if requested_item is None: - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": "The requested item is not found."} # here the `item` field is the software name, but the catalog item contains more info (e.g. `Request Dropbox account`) if not self.config["item"].lower() in requested_item["cat_item"]["display_value"].lower(): - return 0, False, "", {"message": "The requested item is incorrect."} + return 0, False, "", {"message": f"The requested item is incorrect: {requested_item['cat_item']['display_value']} instead of {self.config['item']}"} if not requested_item["quantity"] == str(self.config["quantity"]): return 0, False, "", {"message": "The requested quantity is incorrect."} diff --git a/src/browsergym/workarena/tasks/user_group.py b/src/browsergym/workarena/tasks/user_group.py index 970d0b7..701f54d 100644 --- a/src/browsergym/workarena/tasks/user_group.py +++ b/src/browsergym/workarena/tasks/user_group.py @@ -4,8 +4,8 @@ import playwright.sync_api import requests -from ..api.utils import HTTPError, table_api_call -from ..config import DEACTIVATE_USER_GROUP_CONFIG_PATH +from ..api.utils import HTTPError, table_api_call, db_delete_from_table +from ..config import DEACTIVATE_USER_GROUP_CONFIG_PATH, CREATE_USER_GROUP_CONFIG_PATH, CREATE_USER_GROUP_ADD_USERS_CONFIG_PATH from .base import AbstractServiceNowTask @@ -18,6 +18,8 @@ def __init__(self, seed: int, fixed_config: Dict[str, Any] = None, start_rel_url self.timeout = 60000 self.created_sysids = [] + self.user_group_sys_id = None + def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str, dict]: """Setup the task configuration and produce the goal.""" @@ -34,15 +36,147 @@ def all_configs(self): class CreateUserGroupTask(ServiceNowUserGroupTask): - pass + def all_configs(self): + return json.load(open(CREATE_USER_GROUP_CONFIG_PATH)) -class DeactivateUserGroupTask(ServiceNowUserGroupTask): + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # verify whether a group with the name exists + result = table_api_call( + instance=self.instance, + table="sys_user_group", + params={ + "sysparm_query": f"nameSTARTSWITH{self.config['name']}", + # "sysparm_fields": "number", + "sysparm_limit": 1, + "sysparm_display_value": "true", + }, + )["result"] + + if not result: + return ( + 0, + False, + "", + {"message": "The user group was not found."}, + ) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + self.user_group_sys_id = result[0]["sys_id"] - self.user_group_sys_id = None + # check whether manager is right + if result[0]["manager"]["display_value"] != self.config["manager"]: + return ( + 0, + False, + "", + {"message": "The manager is not correct."}, + ) + + # check whether type is right + if result[0]["type"] != self.config["type"]: + return ( + 0, + False, + "", + {"message": "The type is not correct."}, + ) + + # check whether roles are right + if result[0]["roles"] != self.config["roles"]: + return ( + 0, + False, + "", + {"message": "The roles are not correct."}, + ) + + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The user group was successfully created."}, + ) + + def teardown(self) -> None: + try: + db_delete_from_table( + instance=self.instance, + table="sys_user_group", + sys_id=self.user_group_sys_id, + ) + except HTTPError: + pass + +class CreateUserGroupAddUsersTask(CreateUserGroupTask): + # reusing the teardown from CreateUserGroupTask + + def all_configs(self): + return json.load(open(CREATE_USER_GROUP_ADD_USERS_CONFIG_PATH)) + + def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> Tuple[float, bool, str, dict]: + + # verify whether a group with the name exists + result = table_api_call( + instance=self.instance, + table="sys_user_group", + params={ + "sysparm_query": f"nameSTARTSWITH{self.config['name']}", + # "sysparm_fields": "number", + "sysparm_limit": 1, + "sysparm_display_value": "true", + }, + )["result"] + + if not result: + return ( + 0, + False, + "", + {"message": "The user group was not found."}, + ) + + self.user_group_sys_id = result[0]["sys_id"] + + # check whether description is right + if result[0]["description"] != self.config["description"]: + return ( + 0, + False, + "", + {"message": "The description is not correct."}, + ) + + # check members + result = table_api_call( + instance=self.instance, + table="sys_user_grmember", + params={ + "sysparm_query": f"user_group={self.user_group_sys_id}", + "sysparm_display_value": "true", + }, + )["result"] + group_members = sorted(list(set([member["user"]["display_value"] for member in result]))) + ground_truth_group_members = sorted(list(set([elem.strip() for elem in self.config["members"].split(",")]))) + + if group_members != ground_truth_group_members: + return ( + 0, + False, + "", + {"message": "The members are not correct."}, + ) + + return ( + 1, + True, + "Nice work, thank you!", + {"message": "The user group was successfully created."}, + ) + + + +class DeactivateUserGroupTask(ServiceNowUserGroupTask): def all_configs(self): return json.load(open(DEACTIVATE_USER_GROUP_CONFIG_PATH)) @@ -90,15 +224,13 @@ def validate(self, page: playwright.sync_api.Page, chat_messages: List[str]) -> def teardown(self) -> None: try: - table_api_call( - instance=self.instance, - table="sys_user_group", - params={ - "sysparm_query": f"sys_id={self.user_group_sys_id}", - "sysparm_limit": 1, + requests.patch( + f"{self.instance.snow_url}/api/now/table/sys_user_group/{self.user_group_sys_id}", + auth=self.instance.snow_credentials, + headers={"Accept": "application/json"}, + json={ + "active": True, }, - method="PUT", - data={"active": True}, ) except HTTPError: pass @@ -106,4 +238,6 @@ def teardown(self) -> None: __TASKS__ = [ DeactivateUserGroupTask, + CreateUserGroupTask, + CreateUserGroupAddUsersTask, ] From 1622dde118c0eae8a7768d2217065ed91bdf08b4 Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Tue, 16 Dec 2025 20:53:33 +0000 Subject: [PATCH 55/56] remove base tasks from workarena from dynamic guidance tasks --- src/browsergym/workarena/tasks/service_catalog.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index a36d847..0561c3d 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -1065,9 +1065,6 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str ] __DYNAMIC_GUIDANCE_TASKS__ = [ - OrderAppleWatchTask, - OrderDeveloperLaptopTask, - OrderIpadProTask, OrderIphoneTask, OrderMobilePhoneTask, OrderSoftwareAccessTask, From 3d595b82661137e2ac106fef0a3b2c547c287a2b Mon Sep 17 00:00:00 2001 From: Patrice Bechard Date: Wed, 17 Dec 2025 02:26:56 +0000 Subject: [PATCH 56/56] minor bugfix for validator in order iphone --- src/browsergym/workarena/tasks/service_catalog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browsergym/workarena/tasks/service_catalog.py b/src/browsergym/workarena/tasks/service_catalog.py index 0561c3d..eacb441 100644 --- a/src/browsergym/workarena/tasks/service_catalog.py +++ b/src/browsergym/workarena/tasks/service_catalog.py @@ -748,7 +748,7 @@ def validate(self, page: Page, chat_messages: list[str]) -> tuple[int, bool, str return 0, False, "", {"message": "The requested quantity is incorrect."} # go over values - if requested_item["options"][self.FIELD_NAME_MAPPING["monthly_data_allowance"]] != self.config["monthly_data_allowance"]: + if requested_item["options"][self.FIELD_NAME_MAPPING["monthly_data_allowance"]].lower() != self.config["monthly_data_allowance"].lower(): return 0, False, "", {"message": "The requested monthly data allowance is incorrect."} if requested_item["options"][self.FIELD_NAME_MAPPING["replacement"]] != self.config["replacement"]: