Jobs: Interview Scheduling
Problem Statement
Scheduling interviews requires coordinating availability between candidates and interviewers, selecting time slots, choosing interview format (video/phone/in-person), and sending calendar invitations.
Why Human-Only Semantics Fail
- Calendar availability grids are visual components
- Time slot selection uses click-based interaction
- Interview format options don't declare their requirements (e.g., video link generation)
- "Confirm" sends calendar invites as a side-effect
Why Scraping Fails Here
- Calendar components render as complex grid layouts
- Available slots are fetched dynamically via API
- Timezone handling varies between components
- Calendar invitations are sent server-side (iCal/Google Calendar API)
How AXAG Eliminates Scraping
interview.schedule declares slot selection, format choice, and the side-effects of confirmation (calendar invite, notification).
Annotated UI Example
Jobs — schedule interview
<button
axag-intent="interview.schedule"
axag-entity="interview"
axag-action-type="write"
axag-required-parameters='["application_id","slot_id","format"]'
axag-optional-parameters='["interviewer_notes","candidate_timezone"]'
axag-preconditions='["application must be in interview stage","slot must be available"]'
axag-postconditions='["interview scheduled","calendar invites sent to all participants"]'
axag-risk-level="medium"
axag-confirmation-required="true"
axag-idempotent="true"
axag-side-effects='["calendar_invite","email_notification"]'
axag-description="Schedule an interview for a job application"
>Confirm Interview</button>
Semantic Manifest Excerpt
Manifest — interview.schedule
{
"intent": "interview.schedule",
"entity": "interview",
"action_type": "write",
"operation_id": "interview_schedule",
"description": "Schedule an interview for a job application",
"required_parameters": [
{ "name": "application_id", "type": "string" },
{ "name": "slot_id", "type": "string" },
{ "name": "format", "type": "string", "enum": ["video", "phone", "in_person"] }
],
"optional_parameters": [
{ "name": "interviewer_notes", "type": "string" },
{ "name": "candidate_timezone", "type": "string" }
],
"risk_level": "medium",
"confirmation_required": true,
"idempotent": true,
"side_effects": ["calendar_invite", "email_notification"],
"preconditions": ["application must be in interview stage", "slot must be available"],
"postconditions": ["interview scheduled", "calendar invites sent to all participants"]
}
Generated Tool Example
Tool — interview_schedule
{
"name": "interview_schedule",
"description": "Schedule an interview for a job application",
"input_schema": {
"type": "object",
"properties": {
"application_id": { "type": "string" },
"slot_id": { "type": "string" },
"format": { "type": "string", "enum": ["video", "phone", "in_person"] },
"interviewer_notes": { "type": "string" },
"candidate_timezone": { "type": "string" }
},
"required": ["application_id", "slot_id", "format"]
},
"metadata": {
"action_type": "write",
"risk_level": "medium",
"idempotent": true,
"confirmation_required": true,
"approval_required": false,
"side_effects": ["calendar_invite", "email_notification"],
"source_intent": "interview.schedule",
"source_entity": "interview"
}
}
Constraints & Safety Notes
- Confirmation required: scheduling sends calendar invites to external participants
- Idempotent: re-scheduling to the same slot is a no-op
- Side-effects include external notifications (can't be silently tested)
videoformat auto-generates a meeting link as part of the postcondition- Candidate timezone is used to display correct times in the invite