← Index
11
Total Fixes
5
P0 Critical
5
P1 Serious
1
P2 Audit
3
Files Affected
Scoring & Progress Logic
#1
False "All Done!" at Low Scores
P0 Scoring · Backend
Issue
System shows green checkmark and "All Done!" even when score is 2–35%, misleading users into thinking they've completed the interview.
Root Cause
Backend completion threshold was deliberately lowered to ≥ 1% for testing and was never restored. Comment in code even says so.
File
backend/api/routes/interviews.py · line 468
Change
interviews.py:468
- s.get("segment_completeness_score", 0) >= 1  # Lowered to 1% for testing
+ s.get("segment_completeness_score", 0) >= 70  # Align with frontend threshold
Also aligns with the frontend's existing score >= 70 check in CompletenessResult.tsx:30.
#2
"Continue Anyway" Never Appears on Last Segment
P0 Scoring · Frontend
Issue
Users trapped in "Needs More Detail" retry loop indefinitely on Segment 2 — the escape button is coded to never appear on the last segment.
Root Cause
Condition is retryCount >= 3 && !isLastSegment. The !isLastSegment guard intentionally prevents the button on Segment 2 — the intent was likely to force completion, but instead it creates an inescapable trap.
File
frontend/components/CompletenessResult.tsx · lines 211–221
Change
CompletenessResult.tsx:211
- {retryCount >= 3 && !isLastSegment && (
+ {retryCount >= 3 && (
    <button onClick={onProceed}>
-     Continue Anyway
+     {isLastSegment ? "Submit Anyway" : "Continue Anyway"}
    </button>
  )}
#3
Skipped Questions Penalize Score
P1 Scoring · Backend
Issue
Skipped answers count as 0 against the full denominator, making it impossible to score 100% if any question was skipped — unfairly punishes valid "skip/pass" responses.
Root Cause
calculate_segment_completeness() evaluates the transcript against all target categories regardless of whether questions were actually asked/answered.
File
backend/services/interview_segments.py · lines 450–530
Change
  • Track skipped categories in segment data (skip detection already exists in prompts)
  • Pass skipped_categories as an argument to calculate_segment_completeness()
  • Filter skipped categories from the denominator before Claude evaluates completeness
  • Store skipped_categories as a JSON column on the interview_segments table for auditability
Conversation Control
#4
Silence Detection Fires at 11s (Should Be 15s)
P0 Conversation · ElevenLabs Config
Issue
"Are you there?" prompt fires at 11 seconds — too aggressive, interrupts users who are thinking or taking a breath mid-answer.
Root Cause
This is ElevenLabs server-side VAD (Voice Activity Detection), not the frontend 30s/45s constants (those control the auto-end banner only). The ElevenLabs agent has its own inactivity prompt timer set independently on the dashboard.
File
ElevenLabs Agent Dashboard — both Segment 1 & 2 agents
backend/services/interview_segments.py · lines 100, 162
Change
  • (Dashboard) ElevenLabs agent → Conversation settings → increase inactivity prompt delay from ~11s to 15s for both agents
  • (System prompt) Add to both segment system prompts: "Do not prompt the user if they pause. Wait at least 15 seconds of silence before checking in."
#5
Zombie Sessions — Auto-End Non-Functional
P0 Conversation · Frontend
Issue
When silence persists for 30–45s the session should auto-end, but it doesn't — creating infinite "zombie" loops the user can't escape.
Root Cause
MIN_CONVERSATION_AGE = 5 * 60 * 1000 (5 minutes) — silence detection is completely disabled for the first 5 minutes of a session. If a session stalls before that mark, auto-end can never trigger.
File
frontend/components/SegmentedVoiceInterview.tsx · lines 38–40, 441–488
Change
SegmentedVoiceInterview.tsx:41
- const MIN_CONVERSATION_AGE = 5 * 60 * 1000; // 5 min minimum before auto-end triggers
+ const MIN_CONVERSATION_AGE = 90 * 1000; // 90s minimum — enough to prevent false triggers at start
Also add a WebSocket error handler: if the ElevenLabs connection drops or errors, call endSegment() automatically rather than leaving the user in a blank session.
#6
Premature Termination — Tools & Frameworks Never Reached
P1 Conversation · System Prompts
Issue
Segments end after only 3–4 questions, missing entire categories like "Tools" and "Frameworks" which appear later in the script.
Root Cause
Likely one of two causes: (a) ElevenLabs agent dashboard has a max-turn or max-duration limit set too low, or (b) the SEGMENT_COMPLETE signal in the system prompt is being triggered too aggressively before all categories are covered.
File
backend/services/interview_segments.py · lines 46–173 (both segment prompts)
ElevenLabs Agent Dashboard — check max turn / max duration settings
Change
  • Add to both system prompts: "You MUST cover ALL of the following topics before signaling completion: [enumerate all categories]. Do not send the completion signal until every topic has been addressed at least once."
  • Audit ElevenLabs agent dashboard for any max-turn or max-duration settings; increase or remove them
  • Add a backend guard in the webhook handler: reject SEGMENT_COMPLETE signals if fewer than N categories appear in the transcript
#7
Language Guardrail Broken — Hindi / Tagalog Drift
P1 Conversation · System Prompts
Issue
System ignored Tagalog input, then actively switched to Hindi, and refused to switch back even when the user corrected it in English.
Root Cause
The English-only directive exists in interview_segments.py at lines 100 and 162, but the live ElevenLabs agents on the dashboard may have outdated prompts that predate this guardrail. Code in repo ≠ what's deployed.
File
backend/services/interview_segments.py · lines 100, 162
ElevenLabs Agent Dashboard — verify live system prompts match code
Change
  • Re-sync both agent system prompts to ElevenLabs dashboard — they may have drifted
  • Move the English-only rule to the first line of both system prompts (currently buried at the end where the model may deprioritize it)
  • Strengthen the directive to: "CRITICAL: Conduct this entire interview in English only. If the user responds in any other language, immediately reply in English only. Do not acknowledge, mirror, or switch to their language under any circumstances."
UI / UX Breakdowns
#8
Results Screen Flashes 2s or Fails to Load
P0 UI/UX · Frontend
Issue
After segment completion, the results screen either flashes for ~2 seconds then vanishes, or fails to load entirely, leaving users stranded on a blank screen.
Root Cause
The code has no auto-dismiss timer — but a race condition exists: the component polls for completion, renders the results screen, then a subsequent state update (from a still-running poll interval) transitions the component away from the results view. The poll interval is not stopped when results are shown.
File
frontend/components/SegmentedVoiceInterview.tsx · lines 603+, 792–809
Change
  • Add a resultsLocked boolean state — set to true the moment completion data is received
  • When resultsLocked === true, stop all polling intervals immediately (in the state update's effect)
  • Results view should only unmount when user explicitly clicks "Continue to Next Segment" or "Redo" — never from a background state transition
  • Add useEffect cleanup on the polling interval that runs when the results view becomes visible
#9
"End Segment" Button Disappears During Transitions
P1 UI/UX · Frontend
Issue
The "End Segment" button appears correctly but vanishes when the AI transitions between topics, trapping users in the session with no exit.
Root Cause
Button requires lastSpokeAtRef.current !== null. During topic transitions the AI resets its state (or reconnects), which may clear this ref — causing the button to disappear even though the AI had already spoken.
File
frontend/components/SegmentedVoiceInterview.tsx · lines 1227–1237
Change
SegmentedVoiceInterview.tsx:1227
- {elapsedSeconds >= 180 && lastSpokeAtRef.current !== null && (
+ {elapsedSeconds >= 180 && hasAISpoken && (  // hasAISpoken: boolean state, set once, never reset
Replace the ref check with a persistent hasAISpoken boolean state — set to true the first time the AI speaks, and never reset. Unlike a ref, this guarantees the button stays visible through transitions.
#10
No Confirmation Emails on Completion
P1 UI/UX · Backend / Resend Webhook
Issue
Users receive no confirmation email upon interview completion, leaving them uncertain whether their session was recorded.
Root Cause
Two compounding issues: (1) Fix #1 is blocking — the all_complete flag never fires correctly due to the 1% threshold, so the email trigger never runs. (2) Even with Fix #1 applied, the Resend webhook is likely gated on status = 'completed' (100% both segments) rather than any "final" session state.
File
backend/api/routes/interviews.py · webhook handlers
Resend webhook configuration (external)
Change
  • Dependency: Apply Fix #1 first — this unblocks the completion path
  • Add an explicit Resend email call directly in the all_complete handler in interviews.py — don't rely solely on the webhook which may have conditions we can't easily debug
  • Audit Resend webhook config: change trigger from status = 'completed' to status IN ('completed', 'partially_complete') or on any session state that includes all_complete = true
Verification & Audit
#11
Verify Segment 2 Agent Wiring
P2 Audit · Config
Issue
Possible that Segment 2 agent is pulling Segment 1 instructions ("Pain Points") instead of the "Work Style" script.
Root Cause
ELEVENLABS_AGENT_SEGMENT_2 defaults to a hardcoded fallback agent ID (agent_9101kms0edweeyqtgrw2n9n7h2bw). If the environment variable isn't set in production, it silently uses this default — which may not be correctly configured.
File
backend/services/interview_segments.py · line ~120
Production environment variables
Change
  • Confirm ELEVENLABS_AGENT_SEGMENT_2 is set in production env vars
  • Open ElevenLabs dashboard and confirm agent agent_9101kms0edweeyqtgrw2n9n7h2bw is configured with the Work Style script
  • Add a startup log: logger.info(f"Segment 2 agent: {segment_2_agent_id}") for easier future debugging
  • Raise an error on startup if either agent ID env var is missing (don't silently fall back)
Implementation Summary
# Fix Priority File Effort
01 False "All Done!" at low scores P0 routes/interviews.py:468 S
02 "Continue Anyway" missing on last segment P0 CompletenessResult.tsx:211 S
03 Skipped questions penalize score P1 interview_segments.py:450 M
04 Silence detection fires at 11s P0 ElevenLabs Dashboard + prompts S
05 Zombie sessions — auto-end disabled 5min P0 SegmentedVoiceInterview.tsx:41 S
06 Premature termination — misses Tools/Frameworks P1 interview_segments.py + Dashboard M
07 Language guardrail broken (Hindi/Tagalog) P1 interview_segments.py:100,162 S
08 Results screen flashes / fails to load P0 SegmentedVoiceInterview.tsx:603 M
09 "End Segment" button disappears in transitions P1 SegmentedVoiceInterview.tsx:1227 S
10 No confirmation emails on completion P1 interviews.py + Resend config M
11 Verify Segment 2 agent wiring P2 interview_segments.py:120 + env vars S
11 fixes total 5× P0 · 5× P1 · 1× P2 7× Small · 3× Medium · 0× Large

S < 1 hour    M 1–4 hours    L 4+ hours