Skip to content

State machines & business rules ​

Legend: 🟒 Implemented Β· 🟑 Partial Β· πŸ”΄ Not implemented


1. Interview lifecycle ​

1.1 States ​

StateSpec meaningImplementation
scheduledSnapshot frozen; credits reserved; invitation queued🟒 Enum + scheduleInterview
in_progressLive session; meter/recording active🟒 startInterview
disconnectedRecovery window (≀3 min, inside original end)🟒 disconnectInterview
completedNormal terminal; settlement🟒 β†’ SQS β†’ settlement
abandonedRecovery/original end elapsedπŸ”΄ Enum only; no API path
expiredSweeper past expiresAt; releaseπŸ”΄ No expiry sweeper
cancelledOrg cancel before start; zero charge🟒 + releaseCredits
failedProvider/bot fault🟒 β†’ settleFailedInterview (0)
deleted (soft)deletedAt; filtered from queries🟒 Not a status value

Settlement: orthogonal settledAt + ledger, not a ninth status.

1.2 State diagram ​

stateDiagram-v2
  [*] --> scheduled: create + reserve

  scheduled --> in_progress: preflight OK, live starts
  scheduled --> cancelled: org/admin cancel
  scheduled --> expired: expiresAt sweeper, no session
  scheduled --> failed: pre-start fault (allowed by failInterview)
  scheduled --> deleted: soft delete

  in_progress --> disconnected: connection lost
  in_progress --> completed: normal end / booked limit
  in_progress --> failed: provider/bot fault
  in_progress --> deleted: soft delete (blocked if in_progress)

  disconnected --> in_progress: reconnect in window
  disconnected --> abandoned: recovery/original end elapses
  disconnected --> completed: end while disconnected (allowed)
  disconnected --> failed: fault terminal

  completed --> [*]: settledAt + ledger settle
  abandoned --> [*]: settlement (consumed stand)
  failed --> [*]: settledAt + release (0 charge typical)
  expired --> [*]: release (0 charge)
  cancelled --> [*]: release (0 charge)

  note right of scheduled
    Side effects: reserve ledger,
    join token, invitation
  end note
  note right of completed
    Side effects: settle U,
    release unused, report.generate
  end note

1.3 Valid transitions ​

FromToTrigger (spec)Side effects (spec)Status
β€”scheduledInterview createdSnapshot; reserve; join token; invitation🟒
scheduledin_progressPreflight OK; live beginsMeter; consent; Daily room🟑
in_progressdisconnectedConnection lostMeter pauses🟒
disconnectedin_progressReconnect in windowContext retained🟑 3-min / original-end not server-side
disconnectedabandonedRecovery / original end elapsesTerminal; consumed standπŸ”΄
in_progresscompletedNormal end or limitTranscript; settlement🟒
in_progressfailedProvider faultRemedy table🟑
scheduledcancelledOrg cancelrelease; zero🟒
scheduledexpiredSweeper after expiresAtreleaseπŸ”΄
any non-terminaldeletedSoft deleteHidden from queries🟒
terminalsettlementsettledAt claimIdempotent settle U, release🟒
FromToCodeStatus
disconnectedcompletedcompleteInterview🟒
scheduledfailedfailInterview🟑
scheduled / expireddeleteddeleteInterview + release🟒

1.4 Invalid transitions to guard ​

GuardStatus
Settle before terminal🟑 No status gate in settleCompletedInterview
Release after already settled🟒 Idempotent
Start expired/cancelled/deleted🟑 Partial checks
Second concurrent active session🟑 disconnected excluded from hasActiveInterview
Stale worker after newer sessionπŸ”΄ No generation guard

2. Credit / commitment ​

Logical states β†’ lots, org cache (available / reserved), append-only ledger.

State (spec)ImplementationStatus
Uncommitted availableLot remainingCredits + org available🟒
ReservedLot reservedCredits; ledger reserve🟒
ConsumedLedger settle🟒
Restoredβ€”πŸ”΄
ExpiredexpireLot; forfeit on release from expired lot🟑 No lot sweeper
Deficit / exposureβ€”πŸ”΄
TransitionStatus
Available β†’ Reserved (schedule)🟒
Reserved β†’ Consumed + Released (settle)🟒
Reserved β†’ Released (cancel/fail/zero-U)🟒
Reserved β†’ Forfeited on release (lot expired)🟒
Purchase β†’ Available🟒
Available β†’ Expired (lot)🟑 expireLot only; scheduler πŸ”΄

3. Report / session / recording ​

Session: same as interview status (🟒); no separate entity (πŸ”΄).

Report: not_started β†’ processing β†’ completed | failed (≀3 attempts).

StateStatus
not_started / processing / completed / failed🟒 generateReport, MAX_ATTEMPTS = 3

Recording: pending β†’ processing β†’ completed | failed on interview.recording β€” 🟑 enum + bot updateRuntime; 25% restoration πŸ”΄.


4. Proctoring (FR19) ​

DimensionImplementation
Coverage complete | partial | unavailableπŸ”΄ proctoring Mixed only
Analysis / reviewer dispositionπŸ”΄
Never default 100% integrityπŸ”΄
proctoringCredibility snapshot🟑 partial

5. User & organization ​

EntityStatesStatus
Userinvited (7d TTL), active, disabled🟒
Organizationactive, suspended🟑 suspend API πŸ”΄
Positiondraft β†’ active β†’ archived🟒 schedule requires active

6. Credit arithmetic rules ​

RuleStatus
1 credit = 1 minute; reserve D minutes; charge U actual; 0 ≀ U ≀ reserved🟑 floor whole minutes; no segment aggregation (WAL07)
A = B βˆ’ H (available vs commitments)🟑 cache + lots
Atomicity / idempotency; FIFO lots by expiresAt🟒
Protected commitments through lot expiry until settle🟑
30-day commitment cutoffπŸ”΄
Release after source expiry β†’ forfeit🟒
Restored credits max(original expiry, +90d)πŸ”΄
Purchase expiry 12 months🟒
Ledger adjustment writerπŸ”΄

7. Charge outcomes (remedy table) ​

Outcome (spec)Status
Normal early finish🟑 Floor minutes; release unused
Cancel / no-show / failed preflight β†’ zero🟑 No-show/expired sweeper πŸ”΄
Candidate abandonment β†’ consumed stand🟑 Abandon path πŸ”΄
Recoverable provider outage unbilledπŸ”΄
Partial/unusable evidence restorationπŸ”΄
Recording missing β†’ 25% restoreπŸ”΄
Report delayed ≀24h🟑 Retries only
Duplicate charge reverseπŸ”΄
Retakes consume credits🟒

8. Short-session & abuse ​

ControlStatus
<60s or <2 substantive β†’ insufficient evidence🟑 report 🟒; billing floor 0
3 under-60s / hour / workspace β†’ block 1hπŸ”΄
Report attempts capped at 3🟒
Cost alerts $0.15 / $0.25πŸ”΄

9. WAL01–WAL24 ​

β‰₯1,000 randomized sequences β€” not automated (unit tests on planners only). WAL19 cited Β§16, not in Β§15.1 table.

IDScenario (abbrev.)Status
WAL01Duplicate Stripe β†’ grant once🟑 Code 🟒; concurrency test πŸ”΄
WAL02Failed/pending checkout🟑
WAL03Race for last funds🟑
WAL04Five 20-min holds block sixth🟑
WAL05Unbooked expiry releases🟑 Sweeper πŸ”΄
WAL06Settle 12 of 20🟒 Unit test
WAL07Fractional seconds aggregate onceπŸ”΄
WAL08No-show / preflight zero🟑
WAL09Disconnect/reconnect no double bill🟑
WAL10Abandonment + insufficient threshold🟑 / πŸ”΄
WAL11Crash retry idempotency🟑
WAL12Report retry no second charge🟒
WAL13Restoration remediesπŸ”΄
WAL14Unknown cause β†’ reviewπŸ”΄
WAL15Reschedule swap capacityπŸ”΄ / 🟑
WAL16Lot expiry + appointments🟑 Sweeper πŸ”΄
WAL1730-day protectionπŸ”΄
WAL18Mixed-price packsπŸ”΄
WAL19Chargeback / abuseπŸ”΄
WAL20Reversal + webhook replayπŸ”΄
WAL21100-row batchπŸ”΄
WAL22Demotion during export🟑
WAL23Cost pause vs funded interviewsπŸ”΄
WAL24Stale callbacksπŸ”΄

Gaps: abandoned/expired sweeper; adjustment/restoration; 30-day cutoff; proctoring state machines; under-60s booking block; lot expiry consumer.

Sophia AI Interview Platform β€” Internal Documentation