Skip to main content

Overview

This document defines the canonical interview flow and its associated event model. It standardizes how the system tracks interview progress, transitions states, and determines terminal outcomes.
All events in this document are append-only, immutable, and ordered by timestamp.

Event Payload & Realtime Interview Status

This section defines the canonical event payload schema and the realtime interview status model

Event Payload Schema

Every interview-related event MUST conform to the following payload structure.
{
  "interviewId": "uniqueId",
  "currentStatus": "INTERVIEW_COMPLETED", // Old status of the interview (SCHEDULED, STARTED, NO_SHOW, CANDIDATE_DROP_OFF, INTERVIEW_COMPLETED, REPORT_GENERATED)
  "jobId": "NON_STEM",
  "candidateEmailId": "joenewsman@gmail.com",
  "timestamp": "2025-12-09T14:46:59Z",
  "roleTitle": "Role Title (from Turing)",
  "eventName": "Event Name (from Qode)",
  "eventValue": "Event Value (from Qode)",
  "realtimeStatus": "INTERVIEW_COMPLETED", // New status of the interview (INTERVIEW_SCHEDULED, INTERVIEW_CREATED, INTERVIEW_GETTING_READY, INTERVIEW_STARTED, INTERVIEW_LOCKED, INTERVIEW_COMPLETED, etc.)
  "isTerminal": true
}

Field Definitions

Core Identifiers

  • interviewId Unique identifier for the interview (shared across all attempts). And create another interviewId if send the same payload again.
  • jobId Interview type: STEM, NON-STEM, SWE, DOCKER, DS
  • candidateEmailId Candidate email address used for identification and notifications.

Event Metadata

  • eventName Canonical event name emitted by Qode (example: create_attempt, candidate_ready, attempt_end, abandon).
  • eventValue Optional contextual data for the event (example: failure reason, button clicked, system signal).
  • timestamp UTC timestamp indicating when the event occurred.

Realtime State Fields

  • currentStatus Old interview status that we don’t use anymore in new event flow. In the future, we will use realtimeStatus.
  • realtimeStatus The new realtime interview status, derived from the event stream.
  • isTerminal Boolean indicating whether the interview can progress further.

All Realtime Status Values

Realtime StatusMeaningTerminal
INTERVIEW_SCHEDULEDInterview scheduled but not yet accessedNo
INTERVIEW_CREATEDInterview is createdNo
INTERVIEW_GETTING_READYDevice checks and warm-up in progressNo
INTERVIEW_STARTEDInterview actively running with TracyNo
INTERVIEW_LOCKEDInterview locked from further actionsNo
INTERVIEW_COMPLETEDInterview finalized and report readyYes
INTERVIEW_TECH_FAILURETerminated due to technical failureYes
INTERVIEW_ABANDONEDCandidate disengagedYes
INTERVIEW_TIMEOUTInterview expiredYes
INTERVIEW_CONNECTION_FAILURENetwork-related terminationYes

Canonical Event Model

Each row represents a canonical event emitted during the interview lifecycle.
eventdescriptionfrequencysemantic_meaningreal_time_statusis_terminalterminal_reasonwhat_comes_nextexample_utc_timestamp
create_interview_linkReturn an unique interview_idOnceTuring sends an API request to create an interviewINTERVIEW_SCHEDULEDFALSENONElink_opened
link_openedCandidate opens interview link and loading the preparing page.Once per attemptCandidate signals intent to startINTERVIEW_CREATEDFALSENONEcreate_attempt2025-01-14T10:00:05Z
create_attemptOne interview_id can have multiple attemptsOnce per attemptSystem starts a fresh attempINTERVIEW_CREATEDFALSENONEstart_device_check2025-01-14T10:00:12Z
tracy_joinedAI interviewer joins roomOnce per attemptInterview context initializedINTERVIEW_CREATEDFALSENONEindependent step in backend2025-01-14T10:00:14Z
has_camera_deviceCan get candidate’s camera deviceSend everytime it triggers with UPDATED_CAMERA_DEVICECamera hardware is updatedINTERVIEW_GETTING_READYFALSENONEdevice_check_passed2025-01-14T10:00:18Z
has_mic_deviceCan get candidate’s microphone deviceSend everytime it triggers with UPDATED_MICROPHONE_DEVICEMicrophone hardware is updatedINTERVIEW_GETTING_READYFALSENONEdevice_check_passed2025-01-14T10:00:21Z
device_check_passedHave camera and microphone permissionSend everytime it triggers when have both camera and mic granted permissionSystem confirms technical eligibilityINTERVIEW_GETTING_READYFALSENONEcandidate_ready2025-01-14T10:00:23Z
candidate_readyCandidate clicks Start Button and can join the meeting room. Log from Tracy.Send everytime it triggers, candidate can reload and rejoin againCandidate explicitly consents to proceedINTERVIEW_GETTING_READYFALSENONEface_detected2025-01-14T10:01:10Z
face_detectedFace detected with Tracy presentSend everytime it triggers with enum [CANDIDATE_FACE_IN_BOX, CANDIDATE_NO_FACE_DETECTED, CANDIDATE_FACE_OUTSIDE_BOX]Candidate visually presentINTERVIEW_GETTING_READYFALSENONEspeech_detected2025-01-14T10:01:12Z
speech_detectedSpeech detected during warm-upOnce per attempt [END_WARM_UP, ERROR_IN_WARM_UP]Microphone usable for interviewINTERVIEW_GETTING_READYFALSENONEfirst_question2025-01-14T10:01:20Z
first_questionFirst interview question delivered after warm-up with token start_interviewOnce per attempt when Tracy generates start_interviewInterview content beginsINTERVIEW_STARTEDFALSENONEattempt_end2025-01-14T10:01:21Z
attempt_endend_interview has been generatedOnce per attempt when Tracy generates end_interviewTracy speaks outro and the attempt has concludedINTERVIEW_LOCKEDFALSENONEreport_generated2025-01-14T10:28:40Z
tracy_leftWhen Tracy left the roomOnce per attempt when Tracy leftINTERVIEW_LOCKEDFALSENONEreport_generated2025-01-14T10:28:45Z
report_generatedInterview marked completedOnce per attemptSuccessful terminal outcomeINTERVIEW_COMPLETEDTRUESUCCESS2025-01-14T10:30:00Z

Interview Attempt – Event-Driven Swimlane (Happy Path)

View the interactive flow:
Interview Event Swimlane Diagram (Whimsical)
An interview attempt progresses through six ordered phases, from link access to terminal completion.
  1. Interview Link Exists
  2. Audio and Video Permissions Screen
  3. Candidate Clicks Start
  4. Interview with Tracy
  5. Interview Ends
  6. Completed
Each phase emits canonical events that may:
  • Update the authoritative interview state
  • Trigger downstream processing
  • Transition the attempt into a terminal outcome
All interview behavior is driven by events. States are derived from the event stream and are never written directly.

Happy Path (Successful Completion)

The happy path represents a fully completed interview where the candidate reaches the natural end of the session. Key characteristics
  • Tracy completes the interview flow
  • <end_token> is generated
  • The attempt ends normally
  • Scoring and finalization proceed
Canonical events
  • attempt_end → Tracy speaks outro and generates <end_token>
  • report_generated

Completed State Rules

Once a report_generated event is emitted:
  • The interview attempt is completed
  • All artifacts (transcript, scores, report) are ready
  • The interview link cannot be reused to create a new attempt

Interview Attempt – Failure & Exit Paths (Non-Happy Path)

This section defines all failure and early-exit paths for an interview attempt. These paths represent terminal conditions where the interview cannot continue and can be retried using the same link.
Failure and exit events are authoritative. Once emitted, the interview attempt immediately transitions to a terminal state.

Failure & Exit Flow Overview

An interview attempt may terminate from any active phase, including:
  • Device check failed
  • Candidate drops mid-interview
  • Interview times out
  • Connection failure
Each path emits a single canonical failure or exit event, followed by interview finalization when applicable.

Failure & Exit Paths

1. Device Validation Failure

Occurs during device checks when required hardware or permissions are not met. Flow
  • Device checks in progress
  • Event emitted: device_check_failed

2. Candidate Abandonment

Occurs when the candidate clicks End Interview during interview before attemp_end. Flow
  • Any active step
  • Event emitted: abandon
  • Interview terminates immediately

3. Interview Expiration (Timeout)

Occurs when the interview exceeds the allowed time window. Flow
  • Any active step
  • Event emitted: expire
  • Interview terminates
  • Timeouts are 10 minutes when the meeting is created if candidate doesn’t join the room.

4. Connection Failure

Occurs when the interview session drops due to network issues. Flow
  • Any active step
  • Event emitted: connection_failure
  • Interview terminates
Connection failures are classified separately from abandonment for analytics accuracy. If candidate left during the interview without clicking End Interview, Tracy will wait 5 minutes before leaving the interview.

Canonical Failure & Exit Events

EventDescriptionSemantic MeaningEmitted ByClient VisibleAuthoritative State
device_check_failedDevice validation failedAttempt cannot proceed technicallySystemYesTERMINAL
abandonCandidate clicks End Interview during interview before attemp_endCandidate purposely wants to end the interview.System-detectedYesTERMINAL
expireCandidate doesn’t click Start Interview button after 10 minues.System-enforced timeoutSystemYesTERMINAL
connection_failureConnection failure due to network (candidate left without clicking End Interview) and doesn’t rejoin within 5 minutes.Interview interrupted by connectivity lossSystemYesTERMINAL

Terminal State Rules

Once a failure or exit event is emitted:
  • The interview attempt is irreversibly terminal
  • The interview link can be reused to create a new attempt

Retry & New Attempt Creation

This section defines how the system handles retries after an interview attempt reaches a terminal outcome. Retries are event-driven and always result in the creation of a new interview attempt.
An interview attempt is immutable. Retrying never reopens or modifies a previous attempt.

When a Retry Is Allowed

A retry is allowed only when the previous attempt ended in a terminal but retry-eligible state.

Retry-Eligible Terminal Outcomes

StatusRetry AllowedRationale
INTERVIEW_TECH_FAILUREYesCandidate was blocked by technical issues
INTERVIEW_CONNECTION_FAILUREYesInterview interrupted by network loss
INTERVIEW_TIMEOUTYesInterview expired before completion
INTERVIEW_ABANDONEDYesCandidate disengaged

Non-Retryable Terminal Outcomes

Terminal ReasonRetry AllowedRationale
INTERVIEW_COMPLETEDNoInterview successfully completed
A completed interview can never be retried using the same interview link.