Add Handbook.md benchmark tasks
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
FROM handbook_base
|
||||
|
||||
COPY initial_external_services/ /data/
|
||||
COPY initial_external_services/ /initial_data/
|
||||
COPY initial_workspace/ /workdir/
|
||||
|
||||
ENV INPUTDIR=/data OUTPUTDIR=/data WORLDBENCH_TOOL_SETS="syntara_ds_all google_mail_contacts slack_core google_mail_core google_calendar_core jira_core shopify_core"
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"events": {
|
||||
"evt-1": {
|
||||
"summary": "Orientation - Brandon Ellis",
|
||||
"start": {
|
||||
"dateTime": "2026-04-20T09:00:00-06:00",
|
||||
"timeZone": "America/Denver"
|
||||
},
|
||||
"end": {
|
||||
"dateTime": "2026-04-20T12:00:00-06:00",
|
||||
"timeZone": "America/Denver"
|
||||
},
|
||||
"description": "New hire orientation. Hiring manager: Tom Hayes. Employee personal email: brandon.ellis.personal@gmail.com",
|
||||
"location": "Downtown Campus",
|
||||
"id": "evt-1"
|
||||
},
|
||||
"evt-2": {
|
||||
"summary": "Orientation - Amy Foster",
|
||||
"start": {
|
||||
"dateTime": "2026-03-16T09:00:00-06:00",
|
||||
"timeZone": "America/Denver"
|
||||
},
|
||||
"end": {
|
||||
"dateTime": "2026-03-16T12:00:00-06:00",
|
||||
"timeZone": "America/Denver"
|
||||
},
|
||||
"description": "New hire orientation. Hiring manager: Tom Hayes. Employee personal email: a.foster.personal@gmail.com",
|
||||
"location": "Main Campus",
|
||||
"id": "evt-2"
|
||||
},
|
||||
"evt-3": {
|
||||
"summary": "Posting Closes - Marketing Coordinator",
|
||||
"start": {
|
||||
"date": "2026-03-21"
|
||||
},
|
||||
"end": {
|
||||
"date": "2026-03-22"
|
||||
},
|
||||
"description": "Application deadline for Marketing Coordinator, West Campus (Daniel Yoon position)",
|
||||
"id": "evt-3"
|
||||
},
|
||||
"evt-4": {
|
||||
"summary": "Posting Closes - IT Support Specialist",
|
||||
"start": {
|
||||
"date": "2026-03-28"
|
||||
},
|
||||
"end": {
|
||||
"date": "2026-03-29"
|
||||
},
|
||||
"description": "Application deadline for IT Support Specialist, Main Campus (Marcus Webb position)",
|
||||
"id": "evt-4"
|
||||
},
|
||||
"evt-5": {
|
||||
"summary": "Posting Closes - Finance Analyst",
|
||||
"start": {
|
||||
"date": "2026-04-04"
|
||||
},
|
||||
"end": {
|
||||
"date": "2026-04-05"
|
||||
},
|
||||
"description": "Application deadline for Finance Analyst, Main Campus (Priya Kapoor position)",
|
||||
"id": "evt-5"
|
||||
},
|
||||
"evt-6": {
|
||||
"summary": "Posting Closes - Academic Advisor",
|
||||
"start": {
|
||||
"date": "2026-04-04"
|
||||
},
|
||||
"end": {
|
||||
"date": "2026-04-05"
|
||||
},
|
||||
"description": "Application deadline for Academic Advisor, Downtown Campus (Sarah Mendez position)",
|
||||
"id": "evt-6"
|
||||
}
|
||||
}
|
||||
}
|
||||
+237
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"mailbox": {
|
||||
"email": "hr@crestwood.edu",
|
||||
"name": "Crestwood University HR"
|
||||
},
|
||||
"contacts": [
|
||||
{
|
||||
"email": "n.ashford@crestwood.edu",
|
||||
"name": "Nicole Ashford"
|
||||
},
|
||||
{
|
||||
"email": "p.huang@crestwood.edu",
|
||||
"name": "Patricia Huang"
|
||||
},
|
||||
{
|
||||
"email": "d.okonkwo@crestwood.edu",
|
||||
"name": "Derek Okonkwo"
|
||||
},
|
||||
{
|
||||
"email": "m.voss@crestwood.edu",
|
||||
"name": "Marta Voss"
|
||||
},
|
||||
{
|
||||
"email": "c.briggs@crestwood.edu",
|
||||
"name": "Calvin Briggs"
|
||||
},
|
||||
{
|
||||
"email": "j.park@crestwood.edu",
|
||||
"name": "Jenna Park"
|
||||
},
|
||||
{
|
||||
"email": "j.whitfield@crestwood.edu",
|
||||
"name": "Dr. James Whitfield"
|
||||
},
|
||||
{
|
||||
"email": "hr-escalations@crestwood.edu",
|
||||
"name": "HR Escalations"
|
||||
},
|
||||
{
|
||||
"email": "m.torres@crestwood.edu",
|
||||
"name": "Maria Torres"
|
||||
},
|
||||
{
|
||||
"email": "d.kim@crestwood.edu",
|
||||
"name": "David Kim"
|
||||
},
|
||||
{
|
||||
"email": "j.okafor@crestwood.edu",
|
||||
"name": "James Okafor"
|
||||
},
|
||||
{
|
||||
"email": "r.patel@crestwood.edu",
|
||||
"name": "Rachel Patel"
|
||||
},
|
||||
{
|
||||
"email": "k.walsh@crestwood.edu",
|
||||
"name": "Kevin Walsh"
|
||||
},
|
||||
{
|
||||
"email": "s.bloom@crestwood.edu",
|
||||
"name": "Sandra Bloom"
|
||||
},
|
||||
{
|
||||
"email": "t.hayes@crestwood.edu",
|
||||
"name": "Tom Hayes"
|
||||
},
|
||||
{
|
||||
"email": "l.nguyen@crestwood.edu",
|
||||
"name": "Lisa Nguyen"
|
||||
},
|
||||
{
|
||||
"email": "r.chen@crestwood.edu",
|
||||
"name": "Robert Chen"
|
||||
},
|
||||
{
|
||||
"email": "a.foster@crestwood.edu",
|
||||
"name": "Amy Foster"
|
||||
},
|
||||
{
|
||||
"email": "m.p.torres@crestwood.edu",
|
||||
"name": "Michael Torres"
|
||||
},
|
||||
{
|
||||
"email": "v.osei@crestwood.edu",
|
||||
"name": "Victor Osei"
|
||||
},
|
||||
{
|
||||
"email": "c.navarro@crestwood.edu",
|
||||
"name": "Chris Navarro"
|
||||
},
|
||||
{
|
||||
"email": "danielyoon.work@gmail.com",
|
||||
"name": "Daniel Yoon"
|
||||
},
|
||||
{
|
||||
"email": "priya.kapoor@outlook.com",
|
||||
"name": "Priya Kapoor"
|
||||
},
|
||||
{
|
||||
"email": "marcuswebb84@gmail.com",
|
||||
"name": "Marcus Webb"
|
||||
},
|
||||
{
|
||||
"email": "brandon.ellis.personal@gmail.com",
|
||||
"name": "Brandon Ellis"
|
||||
},
|
||||
{
|
||||
"email": "sarah.mendez92@gmail.com",
|
||||
"name": "Sarah Mendez"
|
||||
}
|
||||
],
|
||||
"folders": [
|
||||
{
|
||||
"name": "Onboarding"
|
||||
},
|
||||
{
|
||||
"name": "Offboarding"
|
||||
},
|
||||
{
|
||||
"name": "Leave"
|
||||
},
|
||||
{
|
||||
"name": "Performance"
|
||||
},
|
||||
{
|
||||
"name": "Recruiting"
|
||||
},
|
||||
{
|
||||
"name": "General"
|
||||
}
|
||||
],
|
||||
"emails": [
|
||||
{
|
||||
"email_id": "1",
|
||||
"folder": "Sent",
|
||||
"subject": "New Hire Welcome \u2014 Ellis, E-1012",
|
||||
"from_addr": "hr@crestwood.edu",
|
||||
"to_addr": "brandon.ellis.personal@gmail.com",
|
||||
"cc_addr": "t.hayes@crestwood.edu",
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-02T09:02:00-06:00",
|
||||
"message_id": "<msg001@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi Brandon,\n\nWelcome to Crestwood University! We are excited to have you join us as an Admissions Counselor in the Admissions department at the Downtown Campus.\n\nYour first day is 04/20/2026. Your supervisor, Tom Hayes, will conduct your orientation session beginning at 9:00am MST. Please bring the following:\n\n\u2022 One document from List A (e.g., U.S. Passport), OR one document from List B (e.g., Driver\u2019s License) AND one document from List C (e.g., Social Security Card)\n\nThese documents are required to complete your I-9 form on your first day.\n\nYou will also receive a benefits enrollment packet during orientation. You will have 30 days from your start date to enroll in or waive benefits.\n\nIf you have any questions before your start date, please don\u2019t hesitate to reach out.\n\nBest regards,\nCrestwood University \u2013 Office of Human Resources\nhr@crestwood.edu",
|
||||
"body_html": null,
|
||||
"is_read": true,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"email_id": "2",
|
||||
"folder": "Sent",
|
||||
"subject": "IT Access Provisioning Request \u2014 Ellis, E-1012",
|
||||
"from_addr": "hr@crestwood.edu",
|
||||
"to_addr": "j.park@crestwood.edu",
|
||||
"cc_addr": null,
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-02T09:03:00-06:00",
|
||||
"message_id": "<msg002@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi Jenna,\n\nPlease provision the following IT access for a new employee:\n\nName: Brandon Ellis\nEmployee ID: E-1012\nPosition: Admissions Counselor\nDepartment: Admissions\nCampus: Downtown\nStart Date: 04/20/2026\nSupervisor: Tom Hayes\n\nPlease have access ready by the employee\u2019s first day. Confirm when complete.\n\nBest regards,\nCrestwood University \u2013 Office of Human Resources\nhr@crestwood.edu",
|
||||
"body_html": null,
|
||||
"is_read": true,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"email_id": "3",
|
||||
"folder": "Sent",
|
||||
"subject": "Orientation Coordinator Request \u2014 Ellis, E-1012",
|
||||
"from_addr": "hr@crestwood.edu",
|
||||
"to_addr": "t.hayes@crestwood.edu",
|
||||
"cc_addr": null,
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-02T09:04:00-06:00",
|
||||
"message_id": "<msg003@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi Tom,\n\nBrandon Ellis is scheduled to begin as Admissions Counselor on 04/20/2026. As the hiring manager, please conduct the in-person orientation on their first day. Orientation should include:\n\n\u2022 Campus tour and introductions\n\u2022 Review of department procedures and expectations\n\u2022 Collection of I-9 Section 1 (completed by employee) and verification of original identity/work authorization documents\n\u2022 Distribution of benefits enrollment packet\n\nPlease have the employee complete the I-9 Section 1, then examine their original documents and complete Section 2. Email the scanned signed form to hr@crestwood.edu.\n\nAttached: i9_form.pdf, benefits_enrollment_packet.pdf\n\nBest regards,\nCrestwood University \u2013 Office of Human Resources\nhr@crestwood.edu",
|
||||
"body_html": null,
|
||||
"is_read": true,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"email_id": "6",
|
||||
"folder": "INBOX",
|
||||
"subject": "New Hire Notifications \u2014 April/May 2026",
|
||||
"from_addr": "d.okonkwo@crestwood.edu",
|
||||
"to_addr": "hr@crestwood.edu",
|
||||
"cc_addr": null,
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-10T07:30:00-06:00",
|
||||
"message_id": "<msg006@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi,\n\nI've collected the new hire confirmations that came in from hiring managers across departments this week. Details for each are below \u2014 please go ahead and initiate onboarding.\n\n1. Sarah Mendez\n Personal Email: sarah.mendez92@gmail.com\n Position: Academic Advisor\n Department: Academic Affairs\n Campus: Downtown\n Start Date: 05/05/2026\n Classification: Exempt, Full-Time\n Supervisor: Tom Hayes\n\n2. Daniel Yoon\n Personal Email: danielyoon.work@gmail.com\n Position: Marketing Coordinator\n Department: Marketing\n Campus: West\n Start Date: 04/28/2026\n Classification: Exempt, Full-Time\n Supervisor: Sandra Bloom\n\n3. Priya Kapoor\n Personal Email: priya.kapoor@outlook.com\n Position: Finance Analyst\n Department: Finance\n Campus: Main\n Start Date: 05/05/2026\n Classification: Exempt, Full-Time\n Supervisor: Robert Chen\n\n4. Marcus Webb\n Personal Email: marcuswebb84@gmail.com\n Position: IT Support Specialist\n Department: Information Technology\n Campus: Main\n Start Date: 04/28/2026\n Classification: Non-Exempt, Full-Time\n Supervisor: Lisa Nguyen\n\n5. Brandon Ellis\n Personal Email: brandon.ellis.personal@gmail.com\n Position: Admissions Counselor\n Department: Admissions\n Campus: Downtown\n Start Date: 04/20/2026\n Classification: Exempt, Full-Time\n Supervisor: Tom Hayes\n\nThanks,\nDerek Okonkwo\nRecruiting & Talent Manager",
|
||||
"body_html": null,
|
||||
"is_read": false,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"email_id": "7",
|
||||
"folder": "INBOX",
|
||||
"subject": "Personnel Action \u2014 Navarro, E-1014",
|
||||
"from_addr": "v.osei@crestwood.edu",
|
||||
"to_addr": "hr@crestwood.edu",
|
||||
"cc_addr": null,
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-10T11:23:00-06:00",
|
||||
"message_id": "<msg007@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi,\n\nI am writing to follow up on the meeting that concluded this morning with Nicole Ashford, Marta Voss, Chris Navarro, and myself. After a thorough discussion of the circumstances, the university has made the decision to terminate Mr. Navarro's employment effective immediately. Chris was informed of this decision during the meeting and has been escorted from the building.\n\nPlease initiate offboarding with the following details:\n\nName: Chris Navarro\nEmployee ID: E-1014\nPosition: Administrative Coordinator\nDepartment: Administration\nCampus: Main\nSupervisor: Victor Osei\nTermination Date: April 10, 2026\nSeparation Type: Involuntary Termination\n\nGiven the nature of this separation, system access should be revoked immediately. Please also coordinate final pay per Colorado law. Nicole Ashford and Marta Voss were both present for the conversation.\n\nVictor Osei\nVP of Administration\nCrestwood University",
|
||||
"body_html": null,
|
||||
"is_read": false,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
},
|
||||
{
|
||||
"email_id": "9",
|
||||
"folder": "INBOX",
|
||||
"subject": "Re: Offer \u2014 Academic Advisor, Downtown Campus",
|
||||
"from_addr": "sarah.mendez92@gmail.com",
|
||||
"to_addr": "hr@crestwood.edu",
|
||||
"cc_addr": null,
|
||||
"bcc_addr": null,
|
||||
"date": "2026-04-10T10:14:00-06:00",
|
||||
"message_id": "<msg009@crestwood.edu>",
|
||||
"in_reply_to": null,
|
||||
"body_text": "Hi,\n\nI appreciate the offer to join Crestwood University as an Academic Advisor. Unfortunately, I have decided to accept another position and will not be able to join your team. I apologize for any inconvenience this may cause.\n\nThank you for the opportunity.\n\nBest regards,\nSarah Mendez",
|
||||
"body_html": null,
|
||||
"is_read": false,
|
||||
"is_important": false,
|
||||
"attachments": []
|
||||
}
|
||||
],
|
||||
"next_email_id": 10
|
||||
}
|
||||
+631
@@ -0,0 +1,631 @@
|
||||
{
|
||||
"issues": {
|
||||
"ONBOARD-1": {
|
||||
"id": "10002",
|
||||
"key": "ONBOARD-1",
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/issue/ONBOARD-1",
|
||||
"fields": {
|
||||
"summary": "ONBOARD-Ellis-04202026",
|
||||
"description": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Employee Name: Brandon Ellis"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Employee ID: E-1012"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Position: Admissions Counselor"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Department: Admissions"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Campus: Downtown"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Start Date: 04/20/2026"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Assignee: HR Coordinator on duty"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"issuetype": {
|
||||
"id": "10001",
|
||||
"name": "Task",
|
||||
"subtask": false,
|
||||
"hierarchyLevel": 0
|
||||
},
|
||||
"project": {
|
||||
"id": "10003",
|
||||
"key": "ONBOARD",
|
||||
"name": "Onboarding"
|
||||
},
|
||||
"status": {
|
||||
"id": "10002",
|
||||
"name": "In Progress",
|
||||
"statusCategory": {
|
||||
"id": 4,
|
||||
"key": "indeterminate",
|
||||
"name": "In Progress",
|
||||
"colorName": "yellow"
|
||||
}
|
||||
},
|
||||
"assignee": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-04-02T09:00:00.000-06:00",
|
||||
"updated": "2026-04-02T09:30:00.000-06:00",
|
||||
"comment": {
|
||||
"comments": [
|
||||
{
|
||||
"id": "1",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:00am [11.1] \u2014 SPREADSHEET UPDATED \u2014 employee_roster.xlsx \u2014 Status set to Onboarding"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:00:00.000-06:00",
|
||||
"updated": "2026-04-02T09:00:00.000-06:00"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:01am [11.1] \u2014 SLACK POSTED \u2014 #hr-onboarding"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:01:00.000-06:00",
|
||||
"updated": "2026-04-02T09:01:00.000-06:00"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:02am [11.1] \u2014 TEMPLATE SENT \u2014 Template 4 to brandon.ellis.personal@gmail.com"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:02:00.000-06:00",
|
||||
"updated": "2026-04-02T09:02:00.000-06:00"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:03am [11.1] \u2014 TEMPLATE SENT \u2014 Template 5 to j.park@crestwood.edu"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:03:00.000-06:00",
|
||||
"updated": "2026-04-02T09:03:00.000-06:00"
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:04am [11.1] \u2014 TEMPLATE SENT \u2014 Template 31 to t.hayes@crestwood.edu"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:04:00.000-06:00",
|
||||
"updated": "2026-04-02T09:04:00.000-06:00"
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"author": {
|
||||
"accountId": "hr-coordinator",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"body": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "04/02/2026 09:05am [11.1] \u2014 CALENDAR EVENT CREATED \u2014 Orientation - Brandon Ellis on 04/20/2026"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"created": "2026-04-02T09:05:00.000-06:00",
|
||||
"updated": "2026-04-02T09:05:00.000-06:00"
|
||||
}
|
||||
],
|
||||
"maxResults": 6,
|
||||
"total": 6,
|
||||
"startAt": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"ONBOARD-2": {
|
||||
"id": "10003",
|
||||
"key": "ONBOARD-2",
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/issue/ONBOARD-2",
|
||||
"fields": {
|
||||
"summary": "ONBOARD-Foster-03162026",
|
||||
"description": {
|
||||
"type": "doc",
|
||||
"version": 1,
|
||||
"content": [
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Employee Name: Amy Foster"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Employee ID: E-1010"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "paragraph",
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "Assignee: HR Coordinator on duty"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"issuetype": {
|
||||
"id": "10001",
|
||||
"name": "Task",
|
||||
"description": "An HR operational task",
|
||||
"subtask": false,
|
||||
"hierarchyLevel": 0
|
||||
},
|
||||
"project": {
|
||||
"id": "10003",
|
||||
"key": "ONBOARD",
|
||||
"name": "Onboarding",
|
||||
"projectTypeKey": "business",
|
||||
"simplified": false,
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/project/ONBOARD"
|
||||
},
|
||||
"status": {
|
||||
"id": "10003",
|
||||
"name": "Done",
|
||||
"description": "Work is complete",
|
||||
"statusCategory": {
|
||||
"id": 3,
|
||||
"key": "done",
|
||||
"name": "Done",
|
||||
"colorName": "green"
|
||||
}
|
||||
},
|
||||
"assignee": {
|
||||
"accountId": "hr-coordinator",
|
||||
"accountType": "atlassian",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"active": true
|
||||
},
|
||||
"reporter": {
|
||||
"accountId": "hr-coordinator",
|
||||
"accountType": "atlassian",
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"active": true
|
||||
},
|
||||
"created": "2026-03-12T10:30:00-06:00",
|
||||
"updated": "2026-03-17T11:00:00-06:00",
|
||||
"comment": {
|
||||
"comments": [
|
||||
{
|
||||
"id": "7",
|
||||
"body": "03/12/2026 10:30am [11.1] \u2014 SPREADSHEET UPDATED \u2014 employee_roster.xlsx \u2014 New row added, Status set to Onboarding",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:30:00-06:00",
|
||||
"updated": "2026-03-12T10:30:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"body": "03/12/2026 10:31am [11.1] \u2014 SPREADSHEET UPDATED \u2014 onboarding_checklist.xlsx \u2014 New row added for Amy Foster",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:31:00-06:00",
|
||||
"updated": "2026-03-12T10:31:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"body": "03/12/2026 10:32am [11.1] \u2014 SLACK POSTED \u2014 #hr-onboarding",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:32:00-06:00",
|
||||
"updated": "2026-03-12T10:32:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"body": "03/12/2026 10:33am [11.1] \u2014 TEMPLATE SENT \u2014 Template 4 to a.foster.personal@gmail.com",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:33:00-06:00",
|
||||
"updated": "2026-03-12T10:33:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "11",
|
||||
"body": "03/12/2026 10:34am [11.1] \u2014 TEMPLATE SENT \u2014 Template 5 to j.park@crestwood.edu",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:34:00-06:00",
|
||||
"updated": "2026-03-12T10:34:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "12",
|
||||
"body": "03/12/2026 10:35am [11.1] \u2014 TEMPLATE SENT \u2014 Template 31 to t.hayes@crestwood.edu",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:35:00-06:00",
|
||||
"updated": "2026-03-12T10:35:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "13",
|
||||
"body": "03/12/2026 10:36am [11.1] \u2014 CALENDAR EVENT CREATED \u2014 Orientation - Amy Foster on 03/16/2026",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-12T10:36:00-06:00",
|
||||
"updated": "2026-03-12T10:36:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "14",
|
||||
"body": "03/16/2026 11:00am [11.2] \u2014 SPREADSHEET UPDATED \u2014 onboarding_checklist.xlsx \u2014 I-9 received and recorded",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-16T11:00:00-06:00",
|
||||
"updated": "2026-03-16T11:00:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "15",
|
||||
"body": "03/17/2026 09:00am [11.1] \u2014 SPREADSHEET UPDATED \u2014 onboarding_checklist.xlsx \u2014 IT access confirmed, orientation complete, overall status set to Complete",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-17T09:00:00-06:00",
|
||||
"updated": "2026-03-17T09:00:00-06:00"
|
||||
},
|
||||
{
|
||||
"id": "16",
|
||||
"body": "03/17/2026 09:01am [11.1] \u2014 TICKET CLOSED \u2014 All onboarding steps complete for Amy Foster (E-1010)",
|
||||
"author": {
|
||||
"emailAddress": "hr@crestwood.edu",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountId": "hr",
|
||||
"accountType": "atlassian"
|
||||
},
|
||||
"created": "2026-03-17T09:01:00-06:00",
|
||||
"updated": "2026-03-17T09:01:00-06:00"
|
||||
}
|
||||
],
|
||||
"total": 10,
|
||||
"maxResults": 50
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sprints": {},
|
||||
"comments": {},
|
||||
"projects": {
|
||||
"HR": {
|
||||
"id": "10001",
|
||||
"key": "HR",
|
||||
"name": "HR Operations",
|
||||
"projectTypeKey": "business",
|
||||
"simplified": false,
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/project/HR"
|
||||
},
|
||||
"OFFBOARD": {
|
||||
"id": "10002",
|
||||
"key": "OFFBOARD",
|
||||
"name": "Offboarding",
|
||||
"projectTypeKey": "business",
|
||||
"simplified": false,
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/project/OFFBOARD"
|
||||
},
|
||||
"ONBOARD": {
|
||||
"id": "10003",
|
||||
"key": "ONBOARD",
|
||||
"name": "Onboarding",
|
||||
"projectTypeKey": "business",
|
||||
"simplified": false,
|
||||
"self": "https://crestwood.atlassian.net/rest/api/3/project/ONBOARD"
|
||||
}
|
||||
},
|
||||
"fields": [
|
||||
{
|
||||
"id": "summary",
|
||||
"key": "summary",
|
||||
"name": "Summary",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "description",
|
||||
"key": "description",
|
||||
"name": "Description",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "status",
|
||||
"key": "status",
|
||||
"name": "Status",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "assignee",
|
||||
"key": "assignee",
|
||||
"name": "Assignee",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "reporter",
|
||||
"key": "reporter",
|
||||
"name": "Reporter",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "created",
|
||||
"key": "created",
|
||||
"name": "Created",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
},
|
||||
{
|
||||
"id": "updated",
|
||||
"key": "updated",
|
||||
"name": "Updated",
|
||||
"custom": false,
|
||||
"searchable": true
|
||||
}
|
||||
],
|
||||
"linkTypes": [],
|
||||
"counters": {
|
||||
"issueId": 10004,
|
||||
"sprintId": 1000,
|
||||
"commentId": 211
|
||||
},
|
||||
"users": {
|
||||
"hr-coordinator": {
|
||||
"accountId": "hr-coordinator",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian",
|
||||
"emailAddress": "hr@crestwood.edu"
|
||||
},
|
||||
"hr": {
|
||||
"accountId": "hr",
|
||||
"displayName": "HR Coordinator",
|
||||
"accountType": "atlassian",
|
||||
"emailAddress": "hr@crestwood.edu"
|
||||
}
|
||||
},
|
||||
"boards": {},
|
||||
"statuses": {
|
||||
"1": {
|
||||
"id": "1",
|
||||
"name": "In Progress",
|
||||
"statusCategory": {
|
||||
"id": 4,
|
||||
"key": "indeterminate",
|
||||
"name": "In Progress",
|
||||
"colorName": "yellow"
|
||||
}
|
||||
},
|
||||
"2": {
|
||||
"id": "2",
|
||||
"name": "Done",
|
||||
"statusCategory": {
|
||||
"id": 3,
|
||||
"key": "done",
|
||||
"name": "Done",
|
||||
"colorName": "green"
|
||||
}
|
||||
}
|
||||
},
|
||||
"workflow": {
|
||||
"In Progress": [
|
||||
{
|
||||
"id": "1",
|
||||
"name": "To In Progress",
|
||||
"to": "In Progress"
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"name": "To Done",
|
||||
"to": "Done"
|
||||
}
|
||||
],
|
||||
"Done": [
|
||||
{
|
||||
"id": "3",
|
||||
"name": "To In Progress",
|
||||
"to": "In Progress"
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"name": "To Done",
|
||||
"to": "Done"
|
||||
}
|
||||
]
|
||||
},
|
||||
"defaultStatusValue": "In Progress"
|
||||
}
|
||||
+503
@@ -0,0 +1,503 @@
|
||||
{
|
||||
"users": {
|
||||
"U001": {
|
||||
"id": "U001",
|
||||
"team_id": "T001",
|
||||
"name": "n.ashford",
|
||||
"deleted": false,
|
||||
"real_name": "Nicole Ashford",
|
||||
"profile": {
|
||||
"real_name": "Nicole Ashford",
|
||||
"display_name": "Nicole Ashford",
|
||||
"email": "n.ashford@crestwood.edu",
|
||||
"title": "HR Director"
|
||||
},
|
||||
"is_admin": true,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U002": {
|
||||
"id": "U002",
|
||||
"team_id": "T001",
|
||||
"name": "p.huang",
|
||||
"deleted": false,
|
||||
"real_name": "Patricia Huang",
|
||||
"profile": {
|
||||
"real_name": "Patricia Huang",
|
||||
"display_name": "Patricia Huang",
|
||||
"email": "p.huang@crestwood.edu",
|
||||
"title": "Benefits & Leave Manager"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U003": {
|
||||
"id": "U003",
|
||||
"team_id": "T001",
|
||||
"name": "d.okonkwo",
|
||||
"deleted": false,
|
||||
"real_name": "Derek Okonkwo",
|
||||
"profile": {
|
||||
"real_name": "Derek Okonkwo",
|
||||
"display_name": "Derek Okonkwo",
|
||||
"email": "d.okonkwo@crestwood.edu",
|
||||
"title": "Recruiting & Talent Manager"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U004": {
|
||||
"id": "U004",
|
||||
"team_id": "T001",
|
||||
"name": "m.voss",
|
||||
"deleted": false,
|
||||
"real_name": "Marta Voss",
|
||||
"profile": {
|
||||
"real_name": "Marta Voss",
|
||||
"display_name": "Marta Voss",
|
||||
"email": "m.voss@crestwood.edu",
|
||||
"title": "Employee Relations Specialist"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U005": {
|
||||
"id": "U005",
|
||||
"team_id": "T001",
|
||||
"name": "c.briggs",
|
||||
"deleted": false,
|
||||
"real_name": "Calvin Briggs",
|
||||
"profile": {
|
||||
"real_name": "Calvin Briggs",
|
||||
"display_name": "Calvin Briggs",
|
||||
"email": "c.briggs@crestwood.edu",
|
||||
"title": "Payroll Liaison"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U006": {
|
||||
"id": "U006",
|
||||
"team_id": "T001",
|
||||
"name": "j.park",
|
||||
"deleted": false,
|
||||
"real_name": "Jenna Park",
|
||||
"profile": {
|
||||
"real_name": "Jenna Park",
|
||||
"display_name": "Jenna Park",
|
||||
"email": "j.park@crestwood.edu",
|
||||
"title": "IT Access Coordinator"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U007": {
|
||||
"id": "U007",
|
||||
"team_id": "T001",
|
||||
"name": "j.whitfield",
|
||||
"deleted": false,
|
||||
"real_name": "Dr. James Whitfield",
|
||||
"profile": {
|
||||
"real_name": "Dr. James Whitfield",
|
||||
"display_name": "Dr. James Whitfield",
|
||||
"email": "j.whitfield@crestwood.edu",
|
||||
"title": "Vice President of Human Resources"
|
||||
},
|
||||
"is_admin": true,
|
||||
"is_owner": true,
|
||||
"is_bot": false
|
||||
},
|
||||
"U008": {
|
||||
"id": "U008",
|
||||
"team_id": "T001",
|
||||
"name": "hr.coordinator",
|
||||
"deleted": false,
|
||||
"real_name": "HR Coordinator",
|
||||
"profile": {
|
||||
"real_name": "HR Coordinator",
|
||||
"display_name": "HR Coordinator",
|
||||
"email": "hr@crestwood.edu",
|
||||
"title": "HR Coordinator"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U009": {
|
||||
"id": "U009",
|
||||
"team_id": "T001",
|
||||
"name": "v.osei",
|
||||
"deleted": false,
|
||||
"real_name": "Victor Osei",
|
||||
"profile": {
|
||||
"real_name": "Victor Osei",
|
||||
"display_name": "Victor Osei",
|
||||
"email": "v.osei@crestwood.edu",
|
||||
"title": "VP of Administration"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
},
|
||||
"U010": {
|
||||
"id": "U010",
|
||||
"team_id": "T001",
|
||||
"name": "c.navarro",
|
||||
"deleted": false,
|
||||
"real_name": "Chris Navarro",
|
||||
"profile": {
|
||||
"real_name": "Chris Navarro",
|
||||
"display_name": "Chris Navarro",
|
||||
"email": "c.navarro@crestwood.edu",
|
||||
"title": "Administrative Coordinator"
|
||||
},
|
||||
"is_admin": false,
|
||||
"is_owner": false,
|
||||
"is_bot": false
|
||||
}
|
||||
},
|
||||
"channels": {
|
||||
"C001": {
|
||||
"id": "C001",
|
||||
"name": "hr-onboarding",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-onboarding",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "New hire processing, I-9 tracking, benefits enrollment, orientation scheduling",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "New hire processing, I-9 tracking, benefits enrollment, orientation scheduling",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C002": {
|
||||
"id": "C002",
|
||||
"name": "hr-offboarding",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-offboarding",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "Resignations, terminations, COBRA notifications, final pay, access revocation",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "Resignations, terminations, COBRA notifications, final pay, access revocation",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C003": {
|
||||
"id": "C003",
|
||||
"name": "hr-leave-requests",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-leave-requests",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "FMLA requests, ADA accommodations, PTO disputes, return-to-work issues",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "FMLA requests, ADA accommodations, PTO disputes, return-to-work issues",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C004": {
|
||||
"id": "C004",
|
||||
"name": "hr-performance",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-performance",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "PIP initiation, evaluation cycle questions, disciplinary actions",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "PIP initiation, evaluation cycle questions, disciplinary actions",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C005": {
|
||||
"id": "C005",
|
||||
"name": "hr-recruiting",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-recruiting",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "Requisition approvals, candidate screening updates, offer status, background checks",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "Requisition approvals, candidate screening updates, offer status, background checks",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C006": {
|
||||
"id": "C006",
|
||||
"name": "hr-escalations",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-escalations",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "Issues requiring HR Director or VP attention",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "Issues requiring HR Director or VP attention \u2014 legal threats, compliance deadlines, unresolved cases older than 10 business days",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
},
|
||||
"C007": {
|
||||
"id": "C007",
|
||||
"name": "hr-general",
|
||||
"is_channel": true,
|
||||
"is_group": false,
|
||||
"is_im": false,
|
||||
"is_mpim": false,
|
||||
"is_private": false,
|
||||
"created": 1700000000,
|
||||
"is_archived": false,
|
||||
"is_general": false,
|
||||
"unlinked": 0,
|
||||
"name_normalized": "hr-general",
|
||||
"is_shared": false,
|
||||
"is_org_shared": false,
|
||||
"is_ext_shared": false,
|
||||
"is_pending_ext_shared": false,
|
||||
"pending_shared": [],
|
||||
"pending_connected_team_ids": [],
|
||||
"context_team_id": "T001",
|
||||
"updated": 1700000000,
|
||||
"creator": "U007",
|
||||
"shared_team_ids": ["T001"],
|
||||
"is_member": true,
|
||||
"topic": {
|
||||
"value": "Non-case-specific questions, policy clarifications, team announcements",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
},
|
||||
"purpose": {
|
||||
"value": "Non-case-specific questions, policy clarifications, team announcements",
|
||||
"creator": "U007",
|
||||
"last_set": 1700000000
|
||||
}
|
||||
}
|
||||
},
|
||||
"messages": {
|
||||
"C002": [
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "SEPARATION: Diane Reyes, E-0987, Voluntary Resignation, Last Day: 02/14/2026, Jira: OFFBOARD-Reyes-02142026",
|
||||
"ts": "1770796800.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "OFFBOARDING COMPLETE: Diane Reyes, E-0987, Separation Type: Voluntary Resignation, Last Day: 02/14/2026",
|
||||
"ts": "1770969600.000100",
|
||||
"team": "T001"
|
||||
}
|
||||
],
|
||||
"C001": [
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "NEW HIRE: Amy Foster, Administrative Coordinator (Non-Exempt), Academic Affairs, Main Campus, Start Date: 03/16/2026, Jira: ONBOARD-2",
|
||||
"ts": "1773651600.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "NEW HIRE: Brandon Ellis, Admissions Counselor (Exempt), Admissions, Downtown Campus, Start Date: 04/20/2026, Jira: ONBOARD-1",
|
||||
"ts": "1775232000.000100",
|
||||
"team": "T001"
|
||||
}
|
||||
],
|
||||
"C003": [
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "FMLA REQUEST: Kevin Walsh, E-1005, Eligible: YES, Certification Due: 01/26/2026, Jira: LEAVE-Walsh-01092026",
|
||||
"ts": "1768032000.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "FMLA APPROVED: Kevin Walsh, E-1005, Leave: 01/26/2026 \u2013 04/05/2026 (approved), Jira: LEAVE-Walsh-01092026",
|
||||
"ts": "1768636800.000100",
|
||||
"team": "T001"
|
||||
}
|
||||
],
|
||||
"C005": [
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "REQUISITION APPROVED: Marketing Coordinator, Marketing, West Campus, Jira: RECRUIT-MarketingCoordinator-03022026",
|
||||
"ts": "1772524800.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "REQUISITION APPROVED: IT Support Specialist, Information Technology, Main Campus, Jira: RECRUIT-ITSupportSpecialist-03092026",
|
||||
"ts": "1773129600.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "REQUISITION APPROVED: Finance Analyst, Finance, Main Campus, Jira: RECRUIT-FinanceAnalyst-03162026",
|
||||
"ts": "1773734400.000100",
|
||||
"team": "T001"
|
||||
},
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "REQUISITION APPROVED: Academic Advisor, Academic Affairs, Downtown Campus, Jira: RECRUIT-AcademicAdvisor-03162026",
|
||||
"ts": "1773734460.000100",
|
||||
"team": "T001"
|
||||
}
|
||||
],
|
||||
"C004": [
|
||||
{
|
||||
"type": "message",
|
||||
"user": "U008",
|
||||
"text": "PERFORMANCE REVIEW CYCLE: Spring 2026 self-assessments due 04/25/2026. Coordinators: please distribute self-assessment forms to all eligible employees by 04/10/2026.",
|
||||
"ts": "1774886400.000100",
|
||||
"team": "T001"
|
||||
}
|
||||
]
|
||||
},
|
||||
"counters": {
|
||||
"messageId": 1020
|
||||
}
|
||||
}
|
||||
+1164
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
+118
@@ -0,0 +1,118 @@
|
||||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R /F3 5 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 12 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 13 0 R /MediaBox [ 0 0 612 792 ] /Parent 10 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 10 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Author (\(anonymous\)) /CreationDate (D:20260410092438-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260410092438-04'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Count 3 /Kids [ 4 0 R 6 0 R 7 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2431
|
||||
>>
|
||||
stream
|
||||
Gb!#]968iG&AJ$Cm(qr-X\JC=WkDB?Q.W3TX1"1Zbif+tTS.t/"XNL!hff*Q&'6)n2Ec.EM.C!1]*mtS*u6b"`ud\Jru;&Ebi/K5!JUpP!"<)<@6TCer92mtTd5C7$r%n(A%EZ?b9KtBWg+![8&Zs4>f@Cm(dhBRm3,6NI2H40RV&`pikrg(]hk<+Ci][L0/3DDcF--gp0[U$D.!&6m$j8g]j]f@2.r`/hZj1/VN:q"SOXr[#FZu"J#6rI6USNB"^R<em#8PD:[</K/t=`6n:Yk[F:OR*,?HmL0tEdd^R7='jR1uU3k_*>c!`NEr,XWs]PG[!H0;bb^DH9-A9s\U4-&mlNkW@U>)14S;YZ>0T>JH%LLBDE$aUDRm5$'$hQ\["<j*L@oZD\cr:e6ok*\Tk0jsbIiPSMD'dKq'&SMH2/IU9UgCY9G?g)BM!(Dop,4n02YHK;5X6ImbUl;B,'ZX4)Cb9MGbVNeSeG31W!JA]i%P.*:5qXa;O:hX'l\U9Op'CtrCf3,tXtYBV-P:/K7j6+_cVQ$bO<m/%SqJ8k(_R=^"A9&mBM8MoV&J+lOKBp5HF=He69rCAKd6k#L,O:QoIH@Fg8cK0.!7"^HqO<u`>%P1%-LPt98ppd4$;UR:8Opl<.db5T/2eO.7=;;`6UH%QRL'UG\+.P]N3#X8+1CfbQhfY/BDNnE/8O3N+-0H&o3,V"aM'p,8`:aZ)4&=(i,GQ\"&+&fSEPs'4$!ZEMiE#QK,ChX(/a>A^[/#j%n^)l1e^K!EH-RRuZqYHTf^dL4o]8A.B'O.1,P6DW3M96q"d,gesbQXt3=/c+,a$Z;%qhW0r0$N[@1hH"bDXnb4h-EBKBAB@IV[C>OA#YDle8kh33;WANs)/"/WmP&F%`C)"O0)EZs\<Z5l#5QFP(jG&JaMc3SaG8+bFJ*i=;)HsQ,30#_Ui/7@kk3l5>gNC`&?#&0Pcet+:DjRfC@D-gfRkr9,Q:L,I8OKPH!M[Y^K"$[20#F,bncZ"%2S2KGc-sD/:eF&r0mM[an[Ggcc%[YB@n5-:PiiGG`Qk!kZ#Qf(=?n&GDS!<Te@/2l$E,isC44i9C)FCWF\0/PmKS/hHOl0:i([SR8e$LOJlYdiVR%5KF$Rg3Fr@Tl0B?$K0[-,MQ0W7s3i`o-'F[OX>n!m>Y%O:1.X.OHs1SpjrAf:Qm++JC?=o02(<N<>gB49,['t8;S%K(FnE!2^FCXCk2.5S\Y615G<sF@cOhqd8\//+'"Za(UVUn/rFGmS3O1P"_?'!_4W*,1Mjes>@K4:SM<\80uNoh)jnlmt[HA0$,X9L9&:t!<AYJ0btn;2"<rHue%[Vci?s,:TnO?rF#/"Z"g(<[WH7^fh'Kfc`1TS4igE6F;^LOC"`P[[m(-1DOi!*W]jPWbYrOtR.1-kSR\Z]r2efdcM*>b#mMaN1M)q9S7lJ^+u>1BQj']4%CiSs[Re%Y.>NItslhFNG;FTO^n,dHc(s6N7`6mYD6U`Zj,jB>q;YBP['jcE0q))=7[OIBaPc6Q'WgV!8GQAFQ*s=%iM+W%&;T&N";oY&6(<]?p%3_*,78pSnPK)<!bNjHJKV)Z)Y)<:S6#`'2?W5.niubODmqcEA8c5-Yg6QNOI1-kaqp2dpqmD\("1is_.mJOR<\ZG[G[Ml$n%+o7`t=;jTa8Ai^37+;Iu9*.j4m!-B$Gnlq0BN#:#6.%C_J;n&2e#EMMiF?0/#FZ=XXRc_fB@Y`bRH<bRm^QJD'5r*%m!$]5rU*XlB0X3I9?@hT=gg>T@>s@G`>6@!T(Q#U97+"#@fC;AjXGd1qY1P.Z;#lmL#f)G)RA^;/^*[!d4."+P;N/\SDlI%&*+&+*U4SNQ("t^bTR[g%Oh\jhdGU0eKa#*R]t(\V$NpaoFe6ZZt"S8RXWK4l]=R>*scf^HrN-KfAa?YOe,T+;RLRYZN$SEHrMVE,+R$pSi4r@4;F,FXqI=sbpe\l"k2Y:dW:P;P!D$R$Ft7"O%qh)FL6mYO%TH4p>5PmlSOHbs2;qn(P)],jY5-/`1%GM=i=bn*ft]s\)>C@;IBN8s-bVFJ<W/C^@.uD>&'B[S,2MhaU^<GQ<P!'r)R%/*4+^!q5p0$+\]eY>+5\jH&k1[0H]f(`aq^Vn%mXt/-\n.'A0j-\%Mb7S&67],L<g5'js'+p^Kc2S_%bUjFtRr[!56f<]nKj/"#4Q`u<0''Pb!@L.ni=`=f;F7%JOpC7QTb`#32`\O]N<\]D`6AXB\S0-ML@;Hc9@b#G;:KaGc]FGU\`+#7iGe>S<`%;=:-]6Hp_V1Cl6`:o[e7JM1#_AmP(9;nhUWfk,BGQ^l;=c-m8Cg*jBQd>?><<eMdi_>13!g<'8rla:(%EiBp\T\IWnZa?BRY_Dg[=.%O<`)a%lL-+kpk:AsIZYM4n'Aa5Qfk5C5Ms.t^sV&BNaN:~>endstream
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1729
|
||||
>>
|
||||
stream
|
||||
Gatm<=``Rl&:WeDoYWlNN@ep8#Js9AN?)r[f)jX-<1HS*_I0`.dU4)=q"O%#8-3:8%)hJ3L$C\4rq`($#h\oBMZ5%9^tBQb0*r0siu&E[Eaa>)(ZWe>LQjlI!VE=+"h;8;F[Jo?/V!'<Kf")Ai.[uH^tU'GT)u:jrTa+EV;VB.56QbhK#c=oIY?1l7-8KT_F+'<FS]rq!99\*ri?h0\d@[!Xr5`_)O7s)^#D^ro*J&L+N=`cZ%,Nb-g-TF2R#0dR1N"!0(X=V!deOQ?qSHg>Cqeoa;HN3Mda_1@_mRFeTm\$H$*PlF18g741+P;"]&MYo9@RtR'+9\b)DskF,5Md`%kQ7$tmB96jgc.&B9gV3F!#rmbntl)P,G=',g`SA!Vg([YtF^*6W9iT'oO7BL>rE]\q6,pr+S.T>9UPn@).tS;b8VI/F[4C-Ze[X5ARu8pQoLr&RSp*!Y,,GMchV#8ake]Ba5G6dP4$pGYKlpAZT`.M\V'/u+-Y)+P'iBkd-/3HZ[4#b<i,KP,QC6^T<h(4I*0,g=+3a&&<S^J5E5AhR%W/O%EF-H]WXnl3WE1:Ub$>eB<l7>j8kK[XWL`aP;^L$.AF%n2T_6Rbl6gO2&3QOjmh_6I#4V(2,'1/B%;=H]@+ithPAF,2M,R7LngH&X(Z&]T]-,4ij#U%SX&PtR,da2RCY`04h&@3Lhn$)M?UpA!&b9n_#VoV2#9@C`MGAChZB*l]47L^)0K<SZsS%6=o8/oJ^KGrNAj,%J=W5;]Z/iaZ]Xi'M6[rpZ.YH;-n4WF)T"bEBHVdDo1CA@M9U/W9DG)Q1!fJS3AFs$,uPCVGH_9$9rY07t$6`su/)[fZ&MlJ5P\0hbRcRJ>,>iD\Sg.M?6AM.*4/N7gZjDq8',@e([18fmdpAS*D*,EMS44;ICu&](X9280-pj&ES;S;hXN%55T/Hc)c?"Dc&gI-(`^`!Raa6kqOW?FlAgZ(1+@?H\l,?gp"EM4C1c1/6a,rXS?bNi`AZ4nqG#^p<@f8/cJbs*s'8h;#!hM'OT^6Jk:VqYN$#*dissF12/7m7Zt2$_KFIV*??(5E/e?g]h\sTj$ruEacFb)ITi&23o6K29]1)N!ETu$qa>2:YO$7)`,t$6Vu*2)G]Q/h?'&1buX^cWc>LgYO,J9;nGj&::[TuHbY96l?%2i0+Gua=KR7kNUEKn]N6,c[dk2FK)5J\R+fX-)KcuD;m0hBHeMk<XODK(2^;[b1ORO/1f%5T\l2$9h\5?pUVc[nAag-_A%!!t%h8Z;9X&&AKHS+F&9M+^HZ'\FQ4P=oRtZlaFNl$Qct,\R?=8nm(a0`pKJj6$HJY?AhP"lMS[GH)b/K,g%\!ll_Wm2WVg7n]Sm17C5lVb#*@sH%G,e$2+'`Fb%_+K:j,@6W5KC?1*U?B[BiRX3hE=c;@g0Q]Fg/":g\np2n^Ae[k:6^9HQUnu&fZ1q,Do*7R!mh)egUahc+4urSS`()eZCcSBE[pq<X4@a'LQ1f%i6hRT,6"dA,E8q]sBE7jt5tmX+$]jpQ%eQkWQc/[dGZTQ,AB.NuJp^<YM[VKC-l$[[W)dg"nc(m&PWr_05br[[Zo=Zb9*5IF[4Lqq[Jqkl+Nicief,QI2;i@?tbXiXfre3,"YX(6uuWk\7W"Y7'<)RD%<R/N93n=&OMoF]VIb-)E+@Xe`l[BKihs^XZCa:Q*b9/TdMU<()3D<^-q-riftcO#V7\"(D9^df~>endstream
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 692
|
||||
>>
|
||||
stream
|
||||
GasalbAQ&g&A7<Zk3*M>.a!&tQaTK7(KqMEF::u"-=sNK8=?2]#jB<QV:ps3`+VS).rfcGLR_Y)J/0*\M[Hu<nbN=i$]u65OWPbHMX0&%HYaXhAk6RYO"$TBa_o2mKg#Pr:Dh+Fp7nO@bR.4;O=bJ8h9\2P$mRurHH;3nag/$Ym01D9?$\o%m<OI9nnK:1+#o$=j2kkf7P2$r90C;DCo6t9^A+PLVNbO=iE"a]equ[a=NL`V(21+;[W28D>=hH:Z;@]TdY4q@GKOUKeiYE*"`7/!C/>SFFON&,5EW^tjDQrM<ukg#(O]<dDC&gjoY4@f2_[ZBYV..m[8[[:<3Cl3:ARBHLsA8piZ3t14"OE;dj_;7?hUI`BPi7crWHKlQC%AQ99!_(9j(Lp44M\.,@E(VRZ>=kVC5GdI2Z6tqFG&o%\)O/-<QFCIf)kn('Hhsiq_/LXP$,hJisZ#Tg_";Y,f,jSWpW/q7(4B]K"hhOMFu*:&4>Jk@KHg^4UZ+=+6mhC_jZ[k9+q2gs5\DU?k988'/K=fktu=0TBP1R?@H_fh#e^4lWFi*"PcNS!iV7O"g7U[',W#9Q"%e%.3Zk=%59cE;4O%JX(YqYiOIS,CCqDr5S[\NoU!mA1TbP_]XK/LHu6gpPmXd>k+h3Rjm3NMZ,54<JnN<DN1Wo@A;RPSfcP@[N)qET"$dI~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 14
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000112 00000 n
|
||||
0000000219 00000 n
|
||||
0000000331 00000 n
|
||||
0000000526 00000 n
|
||||
0000000641 00000 n
|
||||
0000000836 00000 n
|
||||
0000001031 00000 n
|
||||
0000001100 00000 n
|
||||
0000001380 00000 n
|
||||
0000001452 00000 n
|
||||
0000003975 00000 n
|
||||
0000005796 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<909ec1069dabd6fa9ac6054bb27f43a5><909ec1069dabd6fa9ac6054bb27f43a5>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 9 0 R
|
||||
/Root 8 0 R
|
||||
/Size 14
|
||||
>>
|
||||
startxref
|
||||
6579
|
||||
%%EOF
|
||||
BIN
Binary file not shown.
@@ -0,0 +1,99 @@
|
||||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R /F3 4 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/BaseFont /ZapfDingbats /Name /F3 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 11 0 R /MediaBox [ 0 0 612 792 ] /Parent 9 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 9 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Author (\(anonymous\)) /CreationDate (D:20260409220948-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260409220948-04'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2442
|
||||
>>
|
||||
stream
|
||||
GauHMD0+Gi')q<+Yqu-J8uJOXn3,Z>=mkN$Yu=<[F?6#X:a0GDjbj1<G'.jjrY>W-;%s=@alTU\7>'7K#J5o5Z\Sc3I]Vi/.L!=g^t#Oj(4jFC/B;^;nH#MFM_>m4Rd$6u'/:BFb\E)$?(dS8BL:BOC,%4j7-Ll1cu9)7]80nffpE^t6amX\;jru5YMl+!8s:Z]@89lccH?)I=SrJ`+5sLWM+E*3cOh'KoQ4b!'c_hKBu.&K,B/'bB:<_%Hs]1--L?R@=b6q;=3B3bXeM!?f`=iPZ56<0]OSIK'm^X;^UjcBg0_Yshrlu].EjD3p^c/0]S=&R!6__(9@J!1*1Qr@AXjNDqH(+J782^k!.,mb6pU$tHD(I6i!%1$F^\C'A##A!RtM:25dq!:G2_ECMl[Oa_$LEs-SY!DigG3aLni30^Ku<?>5U?OJ6"Cu]RY**Pd&=#Dd$$M3PoJJYm_NmX`G!ERIWLW;'=2XgsA3#cpRBS+hXn&#G3eQ;TuO(.VW>,@RFr*NKd`&0oK`pdJuRG3@$#m;,JUHXVo0YEO6O=Hn\UcD:UG7%t2dH%;YNM<,OZ6?g\8ed@q1U$_b!kW1lKjK-n!/@.e)^)qO77&:FsiL,k-:)?_6L_PoaL/`Lgk;?m^/XgS*toBBd?]>)6$Ns()!Xh?j?0LBK]`N%:F98lDe[,q/8il[5Z`_En_@7crU`3A#U4pJrXWO&B+D`GU;Ln<4@2[PJZ$c$bp='],I@a[`(2HhX%d(P!4e*'/Pd-dWm_W0i<8m/I'rd&tD!nS'l>hcLLKD9;k1aW/XH`!33S-5O:9;n[OZ8bTI'NrPPUgM%p"2hB8,BJpVbb9Sn^up<hrM$H+[]HJ&m7Pf`B\,b*[.oF=8+3:X<hTB?Ok2Zc@nc3[T^A:gasg+1(rn?I`TM4t0<lF(S9F-0@jX+t>B6cFZc*jX&$:?2b_\;sEP!gnQV?im,u@TZX]*`fhe/QhP/lt#BB5-FXnh"i-2u%')In)c*!pAN1(<?8dY:<#2]*3*+KlY92jc^AH54J%Hi/.@@?cA$(XDUeQBHt-Wnc'L:5Lobau#)[!\0-$^?^Y/BL91t4OYYoq:^-O&E-]Jcrj7hjj@]..u!1<K67oD\`?D+*-Mf[`t!FjLI8H@h5T'qqqQ(O"HdV)4kRM`<c$F^C6ka`M9Atp8F-[T3$oTUq?mgVqHeAX462&=\IR8@%u9Okeo%:#>6;9pLoi4G?+LCtL6Z"2:%aMPl9LlE.6?'QQ=mV!XRZs@['s93KYDNO-.0n^QO$K\7[]q,\0"j)*ZgI(1IUauT3+sjG[ZeWom&`hc,J/l]D(g'Hq-DkLC9M^AN\\3S"-64@OQ;Ban];Jb=\iUO!?.N.u>`FL\q9k%FK?g?oPShW#j][WgU0NcO1s?^>gCdm<iD2A[pB7AJM8c[`UHJnK@\.]$h9Zk0]!1Qm,n/aC27ua7)BT&XQH1`OD;gZSUuIW[cGg]U>X32M1;b%L%%$ShTh\I%\:/G23kTj(.Wn3Fa^7Fh`&dG",mSW;O,pcE5_01aY_tDdmCo*db4Hp?#aRXcnk+.)t`Ug$FirArktiIqJ>LU60kJ.t&/#ptg4.oE9aI'Ci$aj/Nh!qn'5m`:(;[&_0Nqr7QMM,LaE4c-&M58g2J]]BX!<c1;W5?noX3HiF(F5N`s)G;hlB-i.tq-gSQW@G1<26K"?#9ONO>ml<R\40BG*1:(pT_1+X'!k:X1,L]:9@YNeWZ4_5K[gLf[fctNB1,Oq*nbH2&lH'N_2IF7EJ>8NG(_<8hm7&mO\-^S5'!-5V3*%D$2r35GI*_:#PP5STLKtFtl_1kTJQf\<L+6GA\Foq'VT/[,Zi\/5,+&ce%89.]mL$eb*29:V%cAsS>(oaL;/C;[%NkpV'%p%is*1L<a!BXH<t8>34Y9jI;*/A\hNk4UbrN`Udt"O"$d:5/,QLAAe*W5Z+VJoL=)H/cm),#MN/L$07h&B9aJFDp/kJk3]FC"bf7(Bkm$VlFBh3*&64YNH7$KcG2m>XC!@s%u/>-bs;][5Ll%G='"`6ajKtVquYE4/rj_-gsG,H$T/tK1(H(G!;W-jGM>+$VghemPAb+6<0im*k!q;uEG$)FBI9!s`>^B>apf*L&)@$![XgYQr<G2$8]?E\AIK^uE/2@lq`GffPJ,HZ?C,5jd-"KV2(.o?5[kNn%*4TgJ)</(^`b.$@M*0sV;=B8O*%>Z/3kV\sH6_r$B`[R()Q+1YnCl-a'dg^OCmh/,XWfA7mgh'`1[*-/nZg.:_nqWDY`GulqkOuO*S($n[[!Yfu44R=QDNY&BO*B8e4]]ar;TO0kLI57Yh/GXY#FF'8NDWD6(9C2aC6'_^UBG12F'/-8=6-((9^pi?$/Ib-6YrLu2*LS\WWa!Z?`%a+^>dR2f5Sf"T6]r?SgttNh'[9N[<b_<hMD)M!>kb>k]i=B~>endstream
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 755
|
||||
>>
|
||||
stream
|
||||
GatU0hf"u<&:Vr4EKBLo3nP9A?CUrHVJ4a&.d\D-j9?uQ#<9&\7-S'n1Z5*<8^qJt^jL@`GA!Or'I(2(o:Aq^=#g\-.8U6E*%30So$;9=%t5%&kF$9['8Feg&Xr6WEZd(UETE3,b?19b=UZ2l#$I_=3Y_dM9F<6&.QG%?`]CUF>L7H$WKsC;<jHm&4fbSk;%0pY:!_-/ItIT(:P>T/_bR/l8cr-FX(l?#HkDW+9T8cj@]iu3Oq9M-@5@K)A9]Wtj1odeoo:pgd^kFh"[(:L/WEbJHReQGp>I(4>+7k/_J/Unn6^<H]iCK!"mW;8OelkAdZL\dPHUuk4-+h=?SJ:*26(hHbVrLqQ2D,I9(A@5]X<jg9THFhYl/#,K[8+t,S;&n'`-_a4#Fcc:h,;4JdRZsq`tOP"q/dA'(&q-iuX7lm#i_5U\FGd=9t2s;S&(S!TQ8#"cNVD-5gN-[\LU:`,RK<UX&A2\T`H*"/aj4TmtEKCV(%p*<!aF=L>:FI)KD/VC*0%$5/?0Q?G[/h0X^(:[0IegPZj[M:0J;[![Ls9q)JR?Ar:7fHoGtaKX&l4\)8d9%P3N!roAYX-s!smpW?&!Ar"TG![EG&.UUf%9_APZ=KZ\6SrsE!o`oVW)hPCNH@M;0[g;#-OV$,$G.s+1@rq]!!k!KD2pQd/Yu=sJUBMDpa#r>&8Rt3nQ<rR)j=OL-:`=9JloRUg8JXp5*-)%4,o6#DHaN@cdb^GdZPE9hA64tIfLdATPs~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 12
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000112 00000 n
|
||||
0000000219 00000 n
|
||||
0000000331 00000 n
|
||||
0000000414 00000 n
|
||||
0000000608 00000 n
|
||||
0000000802 00000 n
|
||||
0000000870 00000 n
|
||||
0000001150 00000 n
|
||||
0000001215 00000 n
|
||||
0000003749 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<0a32b2467bb598d90b50a90d2f6e4d8c><0a32b2467bb598d90b50a90d2f6e4d8c>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 8 0 R
|
||||
/Root 7 0 R
|
||||
/Size 12
|
||||
>>
|
||||
startxref
|
||||
4595
|
||||
%%EOF
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+84
@@ -0,0 +1,84 @@
|
||||
%PDF-1.3
|
||||
%éëñ¿
|
||||
1 0 obj
|
||||
<<
|
||||
/Count 1
|
||||
/Kids [3 0 R]
|
||||
/MediaBox [0 0 595.28 841.89]
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/OpenAction [3 0 R /FitH null]
|
||||
/PageLayout /OneColumn
|
||||
/Pages 1 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/Contents 4 0 R
|
||||
/Parent 1 0 R
|
||||
/Resources 7 0 R
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Filter /FlateDecode
|
||||
/Length 405
|
||||
>>
|
||||
stream
|
||||
xœÅ”AoÔ0„ïýs„C_m'Y'œ(´E€„PÎ(MÞ²A‰½²�.ù÷x“]Ä"$ÂJ-ùϼ±Þ]Ê4v¯J\ÝIÈ �r�Ûr¿¥dF©€.$éeƒg¯û°³¶Á'Ó>±ómŸ£üz8pu§ “†L‰z•’*&Ƶ1CÕá#»µu}ejÆ=?µ¼Ã%nûmgGf<p·¾¼öž½ïÙ„_5ĉF"IæÐRO»QâæCÕó|þóúI`¦rEE~J{{s&+Í©Ð놷•{Kg¢dJE6¡¡Å[Ûü-mšöïRÌrAÅ<lIxÏ#ªº¶1�Öoö×ö›ÖÃÍâÛY|Éx20ƒ\uéZb)Õ9ås÷á�:�X=þÎ0’*EJü#‰^Q>G˜†íÖº€è$¾J;¸š}ôÄ
|
||||
/ó‘(A2û‡>f¥SÊÅ¡±apS�8p³ŸB�`±q/ëãÏBÜ0]ØÅ²Ußšø ©F�GŽcô|œ_ÏZó…Žòßå·tÖ
|
||||
endstream
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold
|
||||
/Encoding /WinAnsiEncoding
|
||||
/Subtype /Type1
|
||||
/Type /Font
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica
|
||||
/Encoding /WinAnsiEncoding
|
||||
/Subtype /Type1
|
||||
/Type /Font
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Font <</F1 5 0 R
|
||||
/F2 6 0 R>>
|
||||
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/CreationDate (D:20260409231453Z)
|
||||
>>
|
||||
endobj
|
||||
xref
|
||||
0 9
|
||||
0000000000 65535 f
|
||||
0000000015 00000 n
|
||||
0000000102 00000 n
|
||||
0000000205 00000 n
|
||||
0000000285 00000 n
|
||||
0000000762 00000 n
|
||||
0000000864 00000 n
|
||||
0000000961 00000 n
|
||||
0000001058 00000 n
|
||||
trailer
|
||||
<<
|
||||
/Size 9
|
||||
/Root 2 0 R
|
||||
/Info 8 0 R
|
||||
/ID [<0F3B1498D7B54A85FA0472753355AF24><0F3B1498D7B54A85FA0472753355AF24>]
|
||||
>>
|
||||
startxref
|
||||
1113
|
||||
@@ -0,0 +1 @@
|
||||
Handle the unread emails from today according to the instructions in the provided SOP. Complete any actions that must be taken "within x days" now rather than deferring.
|
||||
@@ -0,0 +1 @@
|
||||
Today's date is, April, 10. You are an office assistant with access to the user's filesystem (/workdir), email (google_mail_*), slack (slack_*), calendar (google_calendar_*), jira (jira_*), and shopify (shopify_*) tools. The workspace directory /workdir contains files for the task. Do NOT ask the user for more information — use your tools to discover what you need. Begin by listing /workdir and reading relevant files.
|
||||
@@ -0,0 +1,23 @@
|
||||
schema_version = "1.1"
|
||||
|
||||
[task]
|
||||
name = "sop-tasks/hr_crestwood_university_79786c46"
|
||||
description = "SOP task from CSV row 79786c46"
|
||||
|
||||
[agent]
|
||||
timeout_sec = 3600.0
|
||||
|
||||
[verifier]
|
||||
timeout_sec = 3600.0
|
||||
|
||||
[environment]
|
||||
os = "linux"
|
||||
cpus = 2
|
||||
memory_mb = 4096
|
||||
env = { INPUTDIR = "/data", OUTPUTDIR = "/data", WORLDBENCH_TOOL_SETS = "syntara_ds_all google_mail_contacts slack_core google_mail_core google_calendar_core jira_core shopify_core" }
|
||||
|
||||
[[environment.mcp_servers]]
|
||||
name = "mcp-proxy"
|
||||
transport = "streamable-http"
|
||||
url = "http://localhost:8000/mcp"
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
[
|
||||
{
|
||||
"id": "71217907-7deb-40e9-9093-420a3711b96c",
|
||||
"sort_order": 0,
|
||||
"rubric_text": "In `employee_roster.xlsx` Sheet1, rows for Daniel Yoon (department='Marketing', campus='West'), Priya Kapoor (department='Finance', campus='Main'), and Marcus Webb (department='Information Technology', campus='Main') must exist with non-empty employee_id values.",
|
||||
"verifier_code": "from pathlib import Path\nimport openpyxl\n\ndef verify(workspace_path, external_services_path=None):\n xlsx_files = list(Path(workspace_path).glob('**/*.xlsx'))\n roster_files = [f for f in xlsx_files if 'employee_roster' in f.name.lower()]\n if not roster_files:\n return {'pass': False, 'score': 0.0, 'feedback': 'No employee_roster.xlsx file found in workspace'}\n \n wb = openpyxl.load_workbook(roster_files[0])\n ws = wb.worksheets[0]\n \n headers = [str(cell.value).strip().lower() if cell.value else '' for cell in ws[1]]\n \n def find_col(names):\n for name in names:\n for i, h in enumerate(headers):\n if name in h:\n return i\n return None\n \n first_name_col = find_col(['first_name', 'first name', 'firstname'])\n last_name_col = find_col(['last_name', 'last name', 'lastname'])\n name_col = find_col(['name']) if first_name_col is None else None\n emp_id_col = find_col(['employee_id', 'employee id', 'emp_id', 'empid'])\n dept_col = find_col(['department', 'dept'])\n campus_col = find_col(['campus'])\n \n required = [\n {'first': 'Daniel', 'last': 'Yoon', 'dept': 'marketing', 'campus': 'west'},\n {'first': 'Priya', 'last': 'Kapoor', 'dept': 'finance', 'campus': 'main'},\n {'first': 'Marcus', 'last': 'Webb', 'dept': 'information technology', 'campus': 'main'},\n ]\n \n found = {r['last']: False for r in required}\n valid_dept = {r['last']: False for r in required}\n valid_campus = {r['last']: False for r in required}\n valid_id = {r['last']: False for r in required}\n \n for row in ws.iter_rows(min_row=2, values_only=True):\n row = list(row)\n if first_name_col is not None and last_name_col is not None:\n fname = str(row[first_name_col]).strip() if row[first_name_col] else ''\n lname = str(row[last_name_col]).strip() if row[last_name_col] else ''\n elif name_col is not None:\n parts = str(row[name_col]).strip().split() if row[name_col] else []\n fname = parts[0] if parts else ''\n lname = parts[-1] if len(parts) > 1 else ''\n else:\n continue\n \n for req in required:\n if fname.lower() == req['first'].lower() and lname.lower() == req['last'].lower():\n found[req['last']] = True\n emp_id = str(row[emp_id_col]).strip() if emp_id_col is not None and row[emp_id_col] else ''\n dept = str(row[dept_col]).strip().lower() if dept_col is not None and row[dept_col] else ''\n campus = str(row[campus_col]).strip().lower() if campus_col is not None and row[campus_col] else ''\n if emp_id and emp_id.lower() not in ('none', 'null', ''):\n valid_id[req['last']] = True\n if req['dept'] in dept or dept in req['dept']:\n valid_dept[req['last']] = True\n if req['campus'] in campus or campus in req['campus']:\n valid_campus[req['last']] = True\n \n issues = []\n for req in required:\n last = req['last']\n if not found[last]:\n issues.append(f'{req[\"first\"]} {last} not found in roster')\n else:\n if not valid_id[last]:\n issues.append(f'{last} has empty employee_id')\n if not valid_dept[last]:\n issues.append(f'{last} department mismatch (expected {req[\"dept\"]})')\n if not valid_campus[last]:\n issues.append(f'{last} campus mismatch (expected {req[\"campus\"]})')\n \n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': 'Issues: ' + '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'All three employees (Yoon/Marketing/West, Kapoor/Finance/Main, Webb/IT/Main) found with valid employee_ids'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "7fa37e37-4f95-4040-970b-d7e8e4f39065",
|
||||
"sort_order": 1,
|
||||
"rubric_text": "In `onboarding_checklist.xlsx` Sheet1, rows must exist for Daniel Yoon, Priya Kapoor, and Marcus Webb.",
|
||||
"verifier_code": "from pathlib import Path\nimport openpyxl\n\ndef verify(workspace_path, external_services_path=None):\n xlsx_files = list(Path(workspace_path).glob('**/*.xlsx'))\n checklist_files = [f for f in xlsx_files if 'onboarding_checklist' in f.name.lower()]\n if not checklist_files:\n return {'pass': False, 'score': 0.0, 'feedback': 'No onboarding_checklist.xlsx file found in workspace'}\n \n wb = openpyxl.load_workbook(checklist_files[0])\n ws = wb.worksheets[0]\n \n required = [('Daniel', 'Yoon'), ('Priya', 'Kapoor'), ('Marcus', 'Webb')]\n found = {last: False for _, last in required}\n \n for row in ws.iter_rows(min_row=1, values_only=True):\n row_text = ' '.join(str(c) for c in row if c is not None).lower()\n for first, last in required:\n if first.lower() in row_text and last.lower() in row_text:\n found[last] = True\n \n missing = [last for last in found if not found[last]]\n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing rows in onboarding_checklist.xlsx for: {missing}'}\n return {'pass': True, 'score': 1.0, 'feedback': 'Rows found for Daniel Yoon, Priya Kapoor, and Marcus Webb in onboarding_checklist.xlsx'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "ac0968ac-d1b5-49a1-981f-1bbfff91b6db",
|
||||
"sort_order": 2,
|
||||
"rubric_text": "In `jira_state.json`, exactly one issue must exist with summary 'ONBOARD-Yoon-04282026', exactly one with 'ONBOARD-Kapoor-05052026', and exactly one with 'ONBOARD-Webb-04282026'.",
|
||||
"verifier_code": "from pathlib import Path \nimport json \n \ndef verify(workspace_path, external_services_path=None): \n if not external_services_path: \n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n jira_path = Path(external_services_path) / 'jira_state.json'\n if not jira_path.exists(): \n return {'pass': False, 'score': 0.0, 'feedback': 'jira_state.json not found'}\n \n with open(jira_path) as f:\n data = json.load(f) \n \n issues = data.get('issues', {})\n if isinstance(issues, dict):\n all_issues = list(issues.values())\n elif isinstance(issues, list): \n all_issues = issues\n else: \n all_issues = [] \n\n required = ['ONBOARD-Yoon-04282026', 'ONBOARD-Kapoor-05052026', 'ONBOARD-Webb-04282026'] \n counts = {r: 0 for r in required}\n \n for issue in all_issues: \n summary = str(issue.get('fields', {}).get('summary', '')).strip()\n for req in required:\n if summary == req: \n counts[req] += 1\n \n issues_list = [] \n for req in required:\n if counts[req] == 0:\n issues_list.append(f'No Jira issue with summary \"{req}\"')\n elif counts[req] > 1: \n issues_list.append(f'Multiple Jira issues ({counts[req]}) with summary \"{req}\"')\n \n if issues_list: \n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues_list)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Found exactly one each of ONBOARD-Yoon-04282026, ONBOARD-Kapoor-05052026, ONBOARD-Webb-04282026'}",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "914baf74-23f4-4899-95c6-d19bd194e79d",
|
||||
"sort_order": 3,
|
||||
"rubric_text": "In `slack_data.json`, channel `#hr-onboarding` must contain messages containing ALL of: ('NEW HIRE','Daniel Yoon','Marketing Coordinator','Marketing','West','04/28/2026'), ('NEW HIRE','Priya Kapoor','Finance Analyst','Finance','Main','05/05/2026'), and ('NEW HIRE','Marcus Webb','IT Support Specialist','Information Technology','Main','04/28/2026').",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n slack_path = Path(external_services_path) / 'slack_data.json'\n if not slack_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'slack_data.json not found'}\n \n with open(slack_path) as f:\n data = json.load(f)\n \n channels = data.get('channels', {})\n channel_id = None\n for cid, cinfo in channels.items():\n if cinfo.get('name', '').lower() == 'hr-onboarding':\n channel_id = cid\n break\n \n if not channel_id:\n return {'pass': False, 'score': 0.0, 'feedback': '#hr-onboarding channel not found in Slack'}\n \n messages = data.get('messages', {}).get(channel_id, [])\n all_text = ' '.join(str(m.get('text', '')) for m in messages)\n \n required_sets = [\n ['NEW HIRE', 'Daniel Yoon', 'Marketing Coordinator', 'Marketing', 'West', '04/28/2026'],\n ['NEW HIRE', 'Priya Kapoor', 'Finance Analyst', 'Finance', 'Main', '05/05/2026'],\n ['NEW HIRE', 'Marcus Webb', 'IT Support Specialist', 'Information Technology', 'Main', '04/28/2026'],\n ]\n \n missing = []\n for req_set in required_sets:\n # Check each message for all terms in a single message\n found = False\n for msg in messages:\n text = str(msg.get('text', ''))\n if all(term.lower() in text.lower() for term in req_set):\n found = True\n break\n if not found:\n missing.append(str(req_set))\n \n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing #hr-onboarding messages containing all required terms: {missing}'}\n return {'pass': True, 'score': 1.0, 'feedback': 'All three new hire announcements found in #hr-onboarding'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "49d7907f-e047-4120-aded-6170ce85c32e",
|
||||
"sort_order": 4,
|
||||
"rubric_text": "In `mailbox.json`, sent emails must exist: to danielyoon.work@gmail.com with subject containing 'New Hire Welcome' and 'Yoon'; to priya.kapoor@outlook.com with subject containing 'New Hire Welcome' and 'Kapoor'; to marcuswebb84@gmail.com with subject containing 'New Hire Welcome' and 'Webb'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n \n with open(mailbox_path) as f:\n data = json.load(f)\n \n sent_emails = [e for e in data.get('emails', []) if e.get('folder', '').lower() == 'sent']\n \n required = [\n {'to': 'danielyoon.work@gmail.com', 'subj_terms': ['new hire welcome', 'yoon']},\n {'to': 'priya.kapoor@outlook.com', 'subj_terms': ['new hire welcome', 'kapoor']},\n {'to': 'marcuswebb84@gmail.com', 'subj_terms': ['new hire welcome', 'webb']},\n ]\n \n missing = []\n for req in required:\n found = False\n for email in sent_emails:\n to_addr = str(email.get('to_addr', '')).lower()\n subj = str(email.get('subject', '')).lower()\n if req['to'].lower() in to_addr and all(t in subj for t in req['subj_terms']):\n found = True\n break\n if not found:\n missing.append(f\"to {req['to']} with subject containing {req['subj_terms']}\")\n \n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing sent welcome emails: {missing}'}\n return {'pass': True, 'score': 1.0, 'feedback': 'Welcome emails found for Yoon, Kapoor, and Webb'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "4230052e-275b-4cb2-9df4-92903ca05f86",
|
||||
"sort_order": 5,
|
||||
"rubric_text": "In `mailbox.json`, sent emails to j.park@crestwood.edu must exist with subject containing 'IT Access Provisioning Request' and each of 'Yoon', 'Kapoor', 'Webb' (one email each).",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n \n with open(mailbox_path) as f:\n data = json.load(f)\n \n sent_emails = [e for e in data.get('emails', []) if e.get('folder', '').lower() == 'sent']\n \n required_names = ['yoon', 'kapoor', 'webb']\n missing = []\n for name in required_names:\n found = False\n for email in sent_emails:\n to_addr = str(email.get('to_addr', '')).lower()\n subj = str(email.get('subject', '')).lower()\n body = str(email.get('body_text', '')).lower()\n if 'j.park@crestwood.edu' in to_addr and 'it access provisioning request' in subj and name in (subj + body):\n found = True\n break\n if not found:\n missing.append(f'IT Access Provisioning Request to j.park@crestwood.edu mentioning {name}')\n \n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing emails: {missing}'}\n return {'pass': True, 'score': 1.0, 'feedback': 'IT Access Provisioning Request emails sent to j.park@crestwood.edu for Yoon, Kapoor, Webb'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "a7a434a0-2c60-43e5-a7de-7f9e95dd0a11",
|
||||
"sort_order": 6,
|
||||
"rubric_text": "In `mailbox.json`, orientation coordinator request emails must exist: to s.bloom@crestwood.edu with subject containing 'Orientation Coordinator Request' and 'Yoon'; to r.chen@crestwood.edu with subject containing 'Orientation Coordinator Request' and 'Kapoor'; to l.nguyen@crestwood.edu with subject containing 'Orientation Coordinator Request' and 'Webb'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n \n with open(mailbox_path) as f:\n data = json.load(f)\n \n sent_emails = [e for e in data.get('emails', []) if e.get('folder', '').lower() == 'sent']\n \n required = [\n {'to': 's.bloom@crestwood.edu', 'name': 'yoon'},\n {'to': 'r.chen@crestwood.edu', 'name': 'kapoor'},\n {'to': 'l.nguyen@crestwood.edu', 'name': 'webb'},\n ]\n \n missing = []\n for req in required:\n found = False\n for email in sent_emails:\n to_addr = str(email.get('to_addr', '')).lower()\n subj = str(email.get('subject', '')).lower()\n body = str(email.get('body_text', '')).lower()\n if req['to'].lower() in to_addr and 'orientation coordinator request' in subj and req['name'] in (subj + body):\n found = True\n break\n if not found:\n missing.append(f\"Orientation Coordinator Request to {req['to']} mentioning {req['name']}\")\n \n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing emails: {missing}'}\n return {'pass': True, 'score': 1.0, 'feedback': 'Orientation Coordinator Request emails sent to s.bloom (Yoon), r.chen (Kapoor), l.nguyen (Webb)'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "f25ad0db-395e-45c5-bd93-8711356254fe",
|
||||
"sort_order": 7,
|
||||
"rubric_text": "In `calendar_data.json`, orientation events must exist: one containing 'Orientation' and 'Daniel Yoon' starting 2026-04-28 at 9:00am ending 12:00pm; one containing 'Orientation' and 'Priya Kapoor' starting 2026-05-05 at 9:00am ending 12:00pm; one containing 'Orientation' and 'Marcus Webb' starting 2026-04-28 at 9:00am ending 12:00pm.",
|
||||
"verifier_code": "from pathlib import Path \nimport json \n\ndef verify(workspace_path, external_services_path=None): \n if not external_services_path: \n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n cal_path = Path(external_services_path) / 'calendar_data.json'\n if not cal_path.exists(): \n return {'pass': False, 'score': 0.0, 'feedback': 'calendar_data.json not found'}\n \n with open(cal_path) as f:\n data = json.load(f) \n \n events = data.get('events', {})\n if isinstance(events, dict):\n all_events = list(events.values()) \n elif isinstance(events, list):\n all_events = events \n else: \n all_events = []\n\n required = [ \n {'name': 'Daniel Yoon', 'date': '2026-04-28'},\n {'name': 'Priya Kapoor', 'date': '2026-05-05'}, \n {'name': 'Marcus Webb', 'date': '2026-04-28'}, \n ]\n \n missing = [] \n for req in required:\n found = False\n for event in all_events:\n summary = str(event.get('summary', '')).lower() \n start = event.get('start', {})\n end = event.get('end', {}) \n start_str = start.get('dateTime', '') if isinstance(start, dict) else str(start)\n end_str = end.get('dateTime', '') if isinstance(end, dict) else str(end) \n \n if 'orientation' not in summary or req['name'].lower() not in summary: \n continue \n if req['date'] not in start_str: \n continue\n if 'T09:00' not in start_str and 'T9:00' not in start_str: \n continue \n if 'T12:00' not in end_str:\n continue \n found = True \n break \n if not found: \n missing.append(f\"Orientation event for {req['name']} on {req['date']} 9am-12pm\")\n \n if missing:\n return {'pass': False, 'score': 0.0, 'feedback': f'Missing calendar events: {missing}'} \n return {'pass': True, 'score': 1.0, 'feedback': 'Orientation calendar events found for Daniel Yoon (4/28), Priya Kapoor (5/5), Marcus Webb (4/28)'} ",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "e2826577-7298-4d4b-886e-cfe2ea8cb7d5",
|
||||
"sort_order": 8,
|
||||
"rubric_text": "In `employee_roster.xlsx` Sheet1, exactly one row with last_name 'Ellis' or employee_id 'E-1012' must exist, and no row for 'Sarah Mendez' must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport openpyxl\n\ndef verify(workspace_path, external_services_path=None):\n xlsx_files = list(Path(workspace_path).glob('**/*.xlsx'))\n roster_files = [f for f in xlsx_files if 'employee_roster' in f.name.lower()]\n if not roster_files:\n return {'pass': False, 'score': 0.0, 'feedback': 'No employee_roster.xlsx found'}\n \n wb = openpyxl.load_workbook(roster_files[0])\n ws = wb.worksheets[0]\n \n ellis_count = 0\n mendez_found = False\n \n for row in ws.iter_rows(min_row=2, values_only=True):\n row_text = ' '.join(str(c) for c in row if c is not None).lower()\n if 'ellis' in row_text or 'e-1012' in row_text:\n ellis_count += 1\n if 'mendez' in row_text:\n mendez_found = True\n \n issues = []\n if ellis_count == 0:\n issues.append('No row for Ellis (or employee_id E-1012) found in employee_roster.xlsx')\n elif ellis_count > 1:\n issues.append(f'Multiple rows ({ellis_count}) for Ellis found in employee_roster.xlsx (expected exactly 1)')\n if mendez_found:\n issues.append('Row for Sarah Mendez found in employee_roster.xlsx (should not exist)')\n \n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one Ellis row found and no Mendez row in employee_roster.xlsx'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "8df32160-aab8-46be-af83-75a2017bd497",
|
||||
"sort_order": 9,
|
||||
"rubric_text": "In `onboarding_checklist.xlsx` Sheet1, exactly one row for Brandon Ellis must exist and no row for Sarah Mendez must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport openpyxl\n\ndef verify(workspace_path, external_services_path=None):\n xlsx_files = list(Path(workspace_path).glob('**/*.xlsx'))\n checklist_files = [f for f in xlsx_files if 'onboarding_checklist' in f.name.lower()]\n if not checklist_files:\n return {'pass': False, 'score': 0.0, 'feedback': 'No onboarding_checklist.xlsx found'}\n \n wb = openpyxl.load_workbook(checklist_files[0])\n ws = wb.worksheets[0]\n \n ellis_count = 0\n mendez_found = False\n \n for row in ws.iter_rows(min_row=1, values_only=True):\n row_text = ' '.join(str(c) for c in row if c is not None).lower()\n if 'brandon' in row_text and 'ellis' in row_text:\n ellis_count += 1\n if 'mendez' in row_text:\n mendez_found = True\n \n issues = []\n if ellis_count == 0:\n issues.append('No row for Brandon Ellis found in onboarding_checklist.xlsx')\n elif ellis_count > 1:\n issues.append(f'Multiple rows ({ellis_count}) for Brandon Ellis in onboarding_checklist.xlsx (expected 1)')\n if mendez_found:\n issues.append('Row for Sarah Mendez found in onboarding_checklist.xlsx (should not exist)')\n \n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one Brandon Ellis row and no Mendez row in onboarding_checklist.xlsx'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "d867b689-64ea-4683-bffc-a1e8ae7e104b",
|
||||
"sort_order": 10,
|
||||
"rubric_text": "In `jira_state.json`, exactly one issue with summary containing 'ONBOARD-Ellis' must exist, and no issue with summary containing 'ONBOARD-Mendez' must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n jira_path = Path(external_services_path) / 'jira_state.json'\n if not jira_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'jira_state.json not found'}\n\n with open(jira_path) as f:\n data = json.load(f)\n\n issues = data.get('issues', {})\n if isinstance(issues, dict):\n all_issues = list(issues.values())\n elif isinstance(issues, list):\n all_issues = issues\n else:\n all_issues = []\n\n ellis_count = sum(1 for i in all_issues if 'onboard-ellis' in str(i.get('fields', {}).get('summary', '')).lower())\n mendez_count = sum(1 for i in all_issues if 'onboard-mendez' in str(i.get('fields', {}).get('summary', '')).lower())\n\n issues_list = []\n if ellis_count == 0:\n issues_list.append('No Jira issue with summary containing ONBOARD-Ellis found')\n elif ellis_count > 1:\n issues_list.append(f'Multiple ({ellis_count}) Jira issues with ONBOARD-Ellis (expected exactly 1)')\n if mendez_count > 0:\n issues_list.append(f'Jira issue with ONBOARD-Mendez found (should not exist)')\n\n if issues_list:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues_list)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one ONBOARD-Ellis Jira issue and no ONBOARD-Mendez issue found'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "e96a155d-f34d-4af9-a0ab-539d4848f0ff",
|
||||
"sort_order": 11,
|
||||
"rubric_text": "In `slack_data.json`, channel `#hr-onboarding` must contain exactly one message mentioning 'Brandon Ellis'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n slack_path = Path(external_services_path) / 'slack_data.json'\n if not slack_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'slack_data.json not found'}\n\n with open(slack_path) as f:\n data = json.load(f)\n\n channels = data.get('channels', {})\n channel_id = None\n for cid, cinfo in channels.items():\n if cinfo.get('name', '').lower() == 'hr-onboarding':\n channel_id = cid\n break\n\n if not channel_id:\n return {'pass': False, 'score': 0.0, 'feedback': '#hr-onboarding channel not found'}\n\n messages = data.get('messages', {}).get(channel_id, [])\n ellis_msgs = [m for m in messages if 'brandon ellis' in str(m.get('text', '')).lower()]\n\n if len(ellis_msgs) == 0:\n return {'pass': False, 'score': 0.0, 'feedback': 'No message mentioning Brandon Ellis in #hr-onboarding'}\n if len(ellis_msgs) > 1:\n return {'pass': False, 'score': 0.0, 'feedback': f'Found {len(ellis_msgs)} messages mentioning Brandon Ellis in #hr-onboarding (expected exactly 1)'}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one message mentioning Brandon Ellis in #hr-onboarding'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "5831154f-6588-42d0-be73-ad43a167c4f9",
|
||||
"sort_order": 12,
|
||||
"rubric_text": "In `mailbox.json`, exactly one sent email to brandon.ellis.personal@gmail.com must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n mailbox_path = Path(external_services_path) / 'mailbox.json'\n issues = []\n\n if mailbox_path.exists():\n with open(mailbox_path) as f:\n mail_data = json.load(f)\n sent_emails = [e for e in mail_data.get('emails', []) if e.get('folder', '').lower() == 'sent']\n ellis_emails = [e for e in sent_emails if 'brandon.ellis.personal@gmail.com' in str(e.get('to_addr','')).lower()]\n if len(ellis_emails) == 0:\n issues.append('No sent email to brandon.ellis.personal@gmail.com found')\n elif len(ellis_emails) > 1:\n issues.append(f'Found {len(ellis_emails)} sent emails to brandon.ellis.personal@gmail.com (expected exactly 1)')\n else:\n issues.append('mailbox.json not found')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one sent email to brandon.ellis.personal@gmail.com'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "6cbd2d97-2f99-48c8-88b0-77391ccfb370",
|
||||
"sort_order": 13,
|
||||
"rubric_text": "In `calendar_data.json`, exactly one event mentioning 'Ellis' must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n cal_path = Path(external_services_path) / 'calendar_data.json'\n issues = []\n\n if cal_path.exists():\n with open(cal_path) as f:\n cal_data = json.load(f)\n events = cal_data.get('events', {})\n if isinstance(events, dict):\n all_events = list(events.values())\n elif isinstance(events, list):\n all_events = events\n else:\n all_events = []\n ellis_events = [e for e in all_events if 'ellis' in str(e.get('summary', '')).lower()]\n if len(ellis_events) == 0:\n issues.append('No calendar event mentioning Ellis found')\n elif len(ellis_events) > 1:\n issues.append(f'Found {len(ellis_events)} calendar events mentioning Ellis (expected exactly 1)')\n else:\n issues.append('calendar_data.json not found')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Exactly one calendar event mentioning Ellis'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "3651aa78-2855-4d62-9c6b-f2dd9e1778d7",
|
||||
"sort_order": 14,
|
||||
"rubric_text": "In `calendar_data.json`, no events after 04-10-26 mentioning 'Mendez' must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\nimport re\nfrom datetime import datetime\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided; cannot check calendar_data.json'}\n \n cal_path = Path(external_services_path) / 'calendar_data.json'\n if not cal_path.exists():\n # If no calendar data file exists, there are no Mendez events\n return {'pass': True, 'score': 1.0, 'feedback': 'calendar_data.json not found; no Mendez events exist by default'}\n \n with open(cal_path) as f:\n cal_data = json.load(f)\n \n events = cal_data.get('events', {})\n if isinstance(events, dict):\n all_events = list(events.values())\n elif isinstance(events, list):\n all_events = events\n else:\n all_events = []\n \n # The cutoff date: 04-10-26 interpreted as 2026-04-10\n cutoff_date = datetime(2026, 4, 10)\n \n # Find events that mention 'mendez' (case-insensitive) AND are after the cutoff date\n mendez_events_after_cutoff = []\n mendez_events_on_or_before = []\n \n for e in all_events:\n event_str = json.dumps(e).lower()\n if 'mendez' not in event_str:\n continue\n \n # Try to extract date from event fields\n event_date = None\n for date_field in ['start', 'date', 'start_date', 'startDate', 'dateTime', 'start_time']:\n val = e.get(date_field, '')\n if isinstance(val, dict):\n val = val.get('dateTime', val.get('date', ''))\n if isinstance(val, str) and val:\n # Try multiple date formats\n for fmt in ['%Y-%m-%d', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M:%S%z', '%Y-%m-%dT%H:%M', '%m/%d/%Y', '%m-%d-%Y', '%Y-%m-%dT%H:%M:%S.%f%z', '%Y-%m-%dT%H:%M:%S.%f']:\n try:\n parsed = datetime.strptime(val.split('+')[0].split('Z')[0].strip(), fmt.replace('%z', ''))\n event_date = parsed\n break\n except ValueError:\n continue\n # Also try regex to extract date\n if event_date is None:\n match = re.search(r'(\\d{4})-(\\d{2})-(\\d{2})', val)\n if match:\n try:\n event_date = datetime(int(match.group(1)), int(match.group(2)), int(match.group(3)))\n except ValueError:\n pass\n if event_date is not None:\n break\n \n if event_date is not None and event_date > cutoff_date:\n mendez_events_after_cutoff.append(e)\n else:\n mendez_events_on_or_before.append(e)\n \n if mendez_events_after_cutoff:\n summaries = [e.get('summary', e.get('title', '(no summary)')) for e in mendez_events_after_cutoff]\n return {\n 'pass': False,\n 'score': 0.0,\n 'feedback': f'Found {len(mendez_events_after_cutoff)} calendar event(s) after 2026-04-10 mentioning Mendez (should not exist): {summaries}'\n }\n \n info_parts = [f'No calendar events after 2026-04-10 mentioning Mendez found among {len(all_events)} total event(s).']\n if mendez_events_on_or_before:\n summaries = [e.get('summary', e.get('title', '(no summary)')) for e in mendez_events_on_or_before]\n info_parts.append(f'{len(mendez_events_on_or_before)} Mendez event(s) on or before cutoff date (allowed): {summaries}')\n \n return {\n 'pass': True,\n 'score': 1.0,\n 'feedback': ' '.join(info_parts)\n }\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "bb431a04-6f3a-4f8b-81e1-0158cd778eb5",
|
||||
"sort_order": 15,
|
||||
"rubric_text": "In `mailbox.json`, email with id=6 must have is_read=true and folder='Onboarding'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n \n with open(mailbox_path) as f:\n data = json.load(f)\n \n email_6 = None\n for email in data.get('emails', []):\n if str(email.get('email_id', '')) == '6':\n email_6 = email\n break\n \n if email_6 is None:\n return {'pass': False, 'score': 0.0, 'feedback': 'Email with id=6 not found'}\n \n issues = []\n if not email_6.get('is_read', False):\n issues.append('Email id=6 is_read is not True')\n folder = str(email_6.get('folder', '')).lower()\n if 'onboarding' not in folder:\n issues.append(f'Email id=6 folder is \"{email_6.get(\"folder\")}\" (expected \"Onboarding\")')\n \n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Email id=6 is read and in Onboarding folder'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "70a14339-b78d-46f3-bf07-806c66effa1b",
|
||||
"sort_order": 16,
|
||||
"rubric_text": "In `mailbox.json`, a sent or forwarded email to d.okonkwo@crestwood.edu with subject containing 'Offer' and 'Academic Advisor' must exist, and email id=9 must have is_read=true and folder='General'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n\n with open(mailbox_path) as f:\n data = json.load(f)\n\n emails = data.get('emails', [])\n issues = []\n\n # Check sent/forwarded email to d.okonkwo@crestwood.edu with correct subject\n okonkwo_found = False\n for e in emails:\n to_addr = str(e.get('to_addr', '')).lower()\n subj = str(e.get('subject', '')).lower()\n folder = e.get('folder', '').lower()\n if 'd.okonkwo@crestwood.edu' in to_addr and folder in ('sent',) and 'offer' in subj and 'academic advisor' in subj:\n okonkwo_found = True\n break\n if not okonkwo_found:\n issues.append('No sent email to d.okonkwo@crestwood.edu with subject containing \"Offer\" and \"Academic Advisor\" found')\n\n # Check email id=9\n email_9 = next((e for e in emails if str(e.get('email_id', '')) == '9'), None)\n if email_9 is None:\n issues.append('Email id=9 not found')\n else:\n if not email_9.get('is_read', False):\n issues.append('Email id=9 is_read is not True')\n folder = str(email_9.get('folder', '')).lower()\n if 'general' not in folder:\n issues.append(f'Email id=9 folder is \"{email_9.get(\"folder\")}\" (expected \"General\")')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'Sent email to d.okonkwo@crestwood.edu with correct subject found; email id=9 is read and in General folder'}",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "69905c2a-4226-433a-99eb-840ab7e7e447",
|
||||
"sort_order": 17,
|
||||
"rubric_text": "In `slack_data.json`, channel `#hr-escalations` must contain at least one message.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n slack_path = Path(external_services_path) / 'slack_data.json'\n issues = []\n\n if slack_path.exists():\n with open(slack_path) as f:\n slack_data = json.load(f)\n\n channels = slack_data.get('channels', {})\n escalations_id = None\n for cid, cinfo in channels.items():\n name = cinfo.get('name', '').lower()\n if name == 'hr-escalations':\n escalations_id = cid\n\n if escalations_id:\n esc_msgs = slack_data.get('messages', {}).get(escalations_id, [])\n if len(esc_msgs) == 0:\n issues.append('#hr-escalations has no messages (expected at least one)')\n else:\n issues.append('#hr-escalations channel not found in Slack')\n else:\n issues.append('slack_data.json not found')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': '#hr-escalations has at least one message'}\n",
|
||||
"criterion_type": "expected_output"
|
||||
},
|
||||
{
|
||||
"id": "4d1ca98e-f0a8-460a-be73-21d822494f8c",
|
||||
"sort_order": 18,
|
||||
"rubric_text": "In `jira_state.json`, no issue with summary containing 'OFFBOARD-Navarro' must exist.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n jira_path = Path(external_services_path) / 'jira_state.json'\n issues = []\n\n if jira_path.exists():\n with open(jira_path) as f:\n jira_data = json.load(f)\n jira_issues = jira_data.get('issues', {})\n if isinstance(jira_issues, dict):\n all_jira = list(jira_issues.values())\n elif isinstance(jira_issues, list):\n all_jira = jira_issues\n else:\n all_jira = []\n navarro_jira = [i for i in all_jira if 'offboard-navarro' in str(i.get('fields', {}).get('summary', '')).lower()]\n if navarro_jira:\n issues.append(f'Found Jira issue with OFFBOARD-Navarro (should not exist)')\n else:\n issues.append('jira_state.json not found')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'No OFFBOARD-Navarro Jira issue found'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "bc3047ba-d6b3-4eb1-8815-5e2372694341",
|
||||
"sort_order": 19,
|
||||
"rubric_text": "In `slack_data.json`, channel `#hr-offboarding` must contain no message mentioning 'Navarro'.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n\n slack_path = Path(external_services_path) / 'slack_data.json'\n issues = []\n\n if slack_path.exists():\n with open(slack_path) as f:\n slack_data = json.load(f)\n\n channels = slack_data.get('channels', {})\n offboarding_id = None\n for cid, cinfo in channels.items():\n name = cinfo.get('name', '').lower()\n if name == 'hr-offboarding':\n offboarding_id = cid\n\n if offboarding_id:\n off_msgs = slack_data.get('messages', {}).get(offboarding_id, [])\n navarro_in_offboarding = [m for m in off_msgs if 'navarro' in str(m.get('text', '')).lower()]\n if navarro_in_offboarding:\n issues.append(f'Found {len(navarro_in_offboarding)} message(s) mentioning Navarro in #hr-offboarding (should not exist)')\n else:\n issues.append('slack_data.json not found')\n\n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'No messages mentioning Navarro found in #hr-offboarding'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
},
|
||||
{
|
||||
"id": "11427267-bf7c-46af-956a-cce9e820952e",
|
||||
"sort_order": 20,
|
||||
"rubric_text": "In `mailbox.json`, no sent email to j.park@crestwood.edu or c.briggs@crestwood.edu mentioning 'Navarro' must exist, no sent email to c.navarro@crestwood.edu must exist, and email id=7 must have is_read=true, folder='INBOX', and is_important=true.",
|
||||
"verifier_code": "from pathlib import Path\nimport json\n\ndef verify(workspace_path, external_services_path=None):\n if not external_services_path:\n return {'pass': False, 'score': 0.0, 'feedback': 'external_services_path not provided'}\n \n mailbox_path = Path(external_services_path) / 'mailbox.json'\n if not mailbox_path.exists():\n return {'pass': False, 'score': 0.0, 'feedback': 'mailbox.json not found'}\n \n with open(mailbox_path) as f:\n data = json.load(f)\n \n emails = data.get('emails', [])\n sent_emails = [e for e in emails if e.get('folder', '').lower() == 'sent']\n \n issues = []\n \n # Check no sent email to j.park or c.briggs mentioning Navarro\n for email in sent_emails:\n to_addr = str(email.get('to_addr', '')).lower()\n subj = str(email.get('subject', '')).lower()\n body = str(email.get('body_text', '')).lower()\n if 'j.park@crestwood.edu' in to_addr and 'navarro' in (subj + body):\n issues.append('Sent email to j.park@crestwood.edu mentioning Navarro found (should not exist)')\n if 'c.briggs@crestwood.edu' in to_addr and 'navarro' in (subj + body):\n issues.append('Sent email to c.briggs@crestwood.edu mentioning Navarro found (should not exist)')\n if 'c.navarro@crestwood.edu' in to_addr:\n issues.append('Sent email to c.navarro@crestwood.edu found (should not exist)')\n \n # Check email id=7\n email_7 = next((e for e in emails if str(e.get('email_id', '')) == '7'), None)\n if email_7 is None:\n issues.append('Email id=7 not found')\n else:\n if not email_7.get('is_read', False):\n issues.append('Email id=7 is_read is not True')\n folder = str(email_7.get('folder', '')).lower()\n if 'inbox' not in folder:\n issues.append(f'Email id=7 folder is \"{email_7.get(\"folder\")}\" (expected INBOX)')\n if not email_7.get('is_important', False):\n issues.append('Email id=7 is_important is not True')\n \n if issues:\n return {'pass': False, 'score': 0.0, 'feedback': '; '.join(issues)}\n return {'pass': True, 'score': 1.0, 'feedback': 'No Navarro-related sent emails found; email id=7 is read, in INBOX, and marked important'}\n",
|
||||
"criterion_type": "incorrect_behavior"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Run bundled SOP Python verifiers inside a Harbor task container."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
import traceback
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
WORKDIR = Path("/workdir")
|
||||
DATA_DIR = Path("/data")
|
||||
INITIAL_DATA_DIR = Path("/initial_data")
|
||||
TESTS_DIR = Path("/tests")
|
||||
VERIFIER_DIR = Path("/logs/verifier")
|
||||
|
||||
SERVICE_COMPAT_FILES: dict[str, tuple[str, tuple[str, ...]]] = {
|
||||
"slack": ("slack.json", ("slack.json", "slack_data.json")),
|
||||
"google_mail": ("inbox.json", ("inbox.json", "mailbox.json")),
|
||||
"google_calendar": ("calendar_data.json", ("calendar_data.json", "calendar.json")),
|
||||
"jira": ("jira_state.json", ("jira_state.json", "jira_data.json")),
|
||||
"shopify": ("shopify_data.json", ("shopify_data.json",)),
|
||||
}
|
||||
|
||||
|
||||
def _state_path(service: str, seed_name: str) -> Path | None:
|
||||
candidates = [
|
||||
DATA_DIR / service / "final.json",
|
||||
DATA_DIR / service / seed_name,
|
||||
INITIAL_DATA_DIR / service / seed_name,
|
||||
]
|
||||
return next((p for p in candidates if p.is_file()), None)
|
||||
|
||||
|
||||
def _build_compat_external_services(dest: Path) -> None:
|
||||
dest.mkdir(parents=True, exist_ok=True)
|
||||
for service, (seed_name, compat_names) in SERVICE_COMPAT_FILES.items():
|
||||
src = _state_path(service, seed_name)
|
||||
if src is not None:
|
||||
for compat_name in compat_names:
|
||||
shutil.copy2(src, dest / compat_name)
|
||||
|
||||
|
||||
def _coerce_result(raw: Any) -> dict[str, Any]:
|
||||
if isinstance(raw, dict):
|
||||
passed = bool(raw.get("pass", raw.get("passed", False)))
|
||||
score = raw.get("score", 1.0 if passed else 0.0)
|
||||
try:
|
||||
score = float(score)
|
||||
except (TypeError, ValueError):
|
||||
score = 1.0 if passed else 0.0
|
||||
return {
|
||||
"pass": passed,
|
||||
"score": max(0.0, min(1.0, score)),
|
||||
"feedback": str(raw.get("feedback", "")),
|
||||
}
|
||||
passed = bool(raw)
|
||||
return {"pass": passed, "score": 1.0 if passed else 0.0, "feedback": str(raw)}
|
||||
|
||||
|
||||
def _run_one(rubric: dict[str, Any], external_services_path: Path) -> dict[str, Any]:
|
||||
rubric_id = str(rubric.get("id") or "rubric")
|
||||
code = rubric.get("verifier_code")
|
||||
if not isinstance(code, str) or not code.strip():
|
||||
return {
|
||||
"id": rubric_id,
|
||||
"pass": False,
|
||||
"score": 0.0,
|
||||
"feedback": "rubric has no verifier_code",
|
||||
}
|
||||
|
||||
namespace: dict[str, Any] = {"__builtins__": __builtins__}
|
||||
try:
|
||||
exec(compile(code, f"<{rubric_id}>", "exec"), namespace)
|
||||
verify = namespace.get("verify")
|
||||
if not callable(verify):
|
||||
raise RuntimeError("verifier_code did not define verify()")
|
||||
result = _coerce_result(verify(str(WORKDIR), str(external_services_path)))
|
||||
return {"id": rubric_id, **result}
|
||||
except Exception:
|
||||
return {
|
||||
"id": rubric_id,
|
||||
"pass": False,
|
||||
"score": 0.0,
|
||||
"feedback": traceback.format_exc(),
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
rubrics_path = TESTS_DIR / "rubrics.json"
|
||||
if not rubrics_path.is_file():
|
||||
print("[sop-verifier] ERROR: rubrics.json not found", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
rubrics = json.loads(rubrics_path.read_text())
|
||||
if not isinstance(rubrics, list):
|
||||
print("[sop-verifier] ERROR: rubrics.json must be a list", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
with tempfile.TemporaryDirectory(prefix="sop-external-services-") as tmp:
|
||||
compat_dir = Path(tmp)
|
||||
_build_compat_external_services(compat_dir)
|
||||
results = [_run_one(r, compat_dir) for r in rubrics]
|
||||
|
||||
total = len(results)
|
||||
passed = sum(1 for r in results if r.get("pass"))
|
||||
average_score = round(
|
||||
sum(float(r.get("score", 0.0)) for r in results) / total,
|
||||
4,
|
||||
) if total else 0.0
|
||||
|
||||
print(f"[sop-verifier] {passed}/{total} rubrics passed; score={average_score:.2f}")
|
||||
for result in results:
|
||||
status = "PASS" if result.get("pass") else "FAIL"
|
||||
feedback = str(result.get("feedback", "")).replace("\n", " ")[:500]
|
||||
print(f" [{status}] {result.get('id')}: {feedback}")
|
||||
|
||||
output = {
|
||||
"passed": passed == total,
|
||||
"rubrics_passed": passed,
|
||||
"rubrics_total": total,
|
||||
"score": average_score,
|
||||
"rubric_results": results,
|
||||
}
|
||||
(TESTS_DIR / "results.json").write_text(json.dumps(output, indent=2) + "\n")
|
||||
|
||||
VERIFIER_DIR.mkdir(parents=True, exist_ok=True)
|
||||
(VERIFIER_DIR / "reward.txt").write_text(str(average_score))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1 @@
|
||||
Handle the unread emails from today (4/10) according to the instructions in the provided SOP. Complete any actions that must be taken "within x days" now rather than deferring.
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
pip install openpyxl pdfplumber python-docx 2>/dev/null
|
||||
python /tests/sop_verifier.py
|
||||
Reference in New Issue
Block a user