Use this runbook when candidate grading, Judge0 execution, or code-assessment health alerts need review.
application-service owns the hiring domain: assignments, challenge versions, hidden cases, submissions, scoring, similarity, integrity, audit, and employer review. assessment-runner-service is an internal execution boundary that receives code plus test cases and returns verdict evidence. It must not own candidate records or expose hidden fixtures to the frontend.
| Environment | Runner mode | Expected behavior |
|---|---|---|
| Local frontend preview | Browser preview data | UI and E2E can run without backend services |
| Local Docker default | deterministic |
Repeatable preview execution; not trusted production scoring |
| Production compose/Kubernetes | judge0 |
Requires JUDGE0_BASE_URL; missing config fails closed |
| Maintenance outage | fail-closed |
Blocks trusted scoring while preserving evidence and health reason |
Production must never silently fall back to deterministic scoring.
Check runner health directly:
Invoke-RestMethod http://localhost:8089/internal/assessment-runs/healthHealthy production-like response should show:
status = UPmode = judge0judge0Configured = truefailClosed = falsequeueDepthnear zero when idlerunnerVersion = devhire-runtime-v0.7
If health is DOWN or failClosed = true, stop trusting new candidate scores until the reason is resolved.
Gateway workflow smoke:
.\scripts\code-assessment-smoke.ps1 -GatewayUrl http://localhost:8080Use http://localhost:18080 instead when running the CI/high-port Docker Desktop profile (GATEWAY_HOST_PORT=18080).
This covers employer assignment, candidate visible run, candidate final submit, hidden redaction, employer attempt history, employer review, and admin summary.
Live runner smoke:
.\scripts\judge0-smoke.ps1 -RunnerUrl http://localhost:8089This verifies runner health plus accepted, wrong-answer, compile-error, timeout, and policy-blocked Java cases.
Observability smoke:
.\scripts\runtime-observability-smoke.ps1 -GatewayUrl http://localhost:8080This scrapes application-service, assessment-runner-service, and the rest of the local stack for domain metrics.
| Alert | First checks |
|---|---|
DevHireAssessmentRunnerFailClosed |
Verify DEVHIRE_RUNNER_MODE, JUDGE0_BASE_URL, runner logs, and /internal/assessment-runs/health |
DevHireAssessmentRunnerUnavailableSpike |
Check Judge0 availability, runner network policy, internal token route, and application-service runner client failures |
DevHireAssessmentRunnerCompileErrorSpike |
Check starter code, Java harness, active challenge version, and recent challenge publishes |
DevHireAssessmentRunnerTimeoutSpike |
Check Judge0 queue latency, time limits, infinite-loop submissions, and runner capacity |
DevHireAssessmentRunnerPolicyBlockedSpike |
Review policy rules and candidate code patterns; confirm no starter snippet violates sandbox policy |
DevHireAssessmentRunnerQueueDepthHigh |
Scale runner/Judge0 capacity or pause assignment volume |
DevHireCodeRunnerClientFailures |
Check service discovery, gateway/internal token configuration, and runner readiness |
Candidate-facing payloads must not include:
- hidden
stdin - hidden
expected_output - hidden stdout/stderr
- hidden compile output
- hidden fixture names that disclose edge cases
Employer/admin review may show hidden pass/total aggregates and sanitized runtime metadata. Admin challenge authoring is the only surface that should expose full hidden fixture authoring data.
- Stop new assignments if fail-closed or unavailable verdicts are active.
- Confirm
assessment-runner-servicehealth and Judge0 connectivity. - Run
judge0-smoke.ps1against the runner. - Run
code-assessment-smoke.ps1through Gateway. - Check
/adminassessment health and Prometheus runner panels. - Reopen or reassign impacted assessments only after runner health and smoke tests pass.
Do not manually edit raw scores. Use employer review state or explicit reopen/reassign workflows so the audit trail stays intact.