> ## Documentation Index
> Fetch the complete documentation index at: https://f4c7a9e2d8b1-docs.tenzo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# AI Interview module

> Work progress, activate behavior, and Tenzo projection for AI Interview V1

<Warning>
  **Restricted Access**: This documentation is only accessible to @tenzo.ai and @salv.ai email addresses.
</Warning>

## Responsibility

AI Interview owns the durable lifecycle after Resume Review continues the workflow. Its
**work runner** creates a module run, claims it in-process, and then uses the existing Tenzo
writers for recruiter-visible stages. It is not a private hop executor. See
[Module and stage-orchestrator contract](/internal/modules/orchestrator-contract).
The module does not own parks such as `NO_CONSENT`
or `COOLING_DOWN`; those remain overlays on the compatibility stage.

The coordinator described in [Module-owned stage orchestration](/internal/modules/overview)
still returns `START_AI_INTERVIEW`. Resume Review `continue_handoff` is the only activate
hook, including ingest that bypasses Resume Review scoring.

## Work progress

Sit-able stages are on the compiled AI Interview module (`OUTREACH` through
`CALL_COMPLETED` and parks inside the click-in). The values below are lease
and work progress on the module run, not a second stage language.

| Progress    | Meaning                                                                                                                               | May move to                          |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `pending`   | The module exists and is ready to be claimed. The compatibility stage is still the prior CCI stage, usually `AWAITING_RESUME_REVIEW`. | `outreach`, `bypassed`               |
| `outreach`  | Interviews are enabled and the run has been claimed. Projects to `OUTREACH`.                                                          | `scheduled`, `completed`, `bypassed` |
| `scheduled` | A scheduled interview writer has landed `AI_INTERVIEW_SCHEDULED`.                                                                     | `completed`                          |
| `completed` | A completed-call or failed-knockout writer has landed a terminal interview.                                                           | Terminal                             |
| `bypassed`  | Interviews are disabled or the job is resume-review-only. Projects to `SKIP_OUTREACH`.                                                | Terminal                             |

Parks (`NO_CONSENT`, `COOLING_DOWN`, `DISPOSITIONED_IN_ATS`, and similar) do not change
the Interview local stage.

## Fixed V1 flow

```text theme={null}
pending ──> outreach ──> scheduled ──> completed
   │            │
   │            └──> completed
   │            └──> bypassed
   └──────────> bypassed
```

Every flag-on application that reaches `continue_handoff` gets one Interview run,
including resume-only jobs. Those runs land on `bypassed` rather than remaining absent.

## Activate

Activate is in-process. There is no Interview queue worker.

1. Create-or-get the `ai_interview` run at `pending`.
2. If the frozen snapshot has interviews disabled, publish `bypassed` and project
   `SKIP_OUTREACH` from that snapshot. Do not re-read the live job setting.
3. Otherwise claim `pending` → `outreach` and keep the existing `OUTREACH` plus
   pending-call writers.

Create-or-get is unique on `(candidate_campaign_id, module_key)`. Re-running handoff
does not insert a second row. If CCI is already `OUTREACH` or `SKIP_OUTREACH`, activate
still ensures the run exists and does not repeat the Tenzo writer when the projection
is already there.

## Configuration snapshot

The orchestrator freezes whether interviews are enabled, the applicant call type
(`WEB` / `PHONE`), and a source-version digest when the run is created. Retries read
that snapshot. Later job-setting edits do not change an in-flight run.

## Thin publishers

After the canonical Tenzo writers commit, a no-op-if-absent helper publishes the
matching Interview stage:

* `AI_INTERVIEW_SCHEDULED` → `scheduled`
* `CALL_COMPLETED` / `FAILED_KNOCKOUT` (including reused interviews) → `completed`
* `SKIP_OUTREACH` → `bypassed` when the run is not already there

Flag-off applications have no Interview row, so the helper does nothing.

## `TenzoStage` projection

Recruiters still read `TenzoStage`. Interview local stages do not change list columns,
filters, or ATS automation. Transition validation never reads `TenzoStage` as its local
source of truth.

## Operational checks

When an Interview workflow appears stuck, inspect:

1. the current local stage and latest module-history sequence;
2. whether Resume Review has a continuing terminal and `continue_handoff` ran;
3. the configuration-snapshot `interviews_enabled` value;
4. the derived `TenzoStage` projection last.

Do not infer module progress from queue delivery count or repair it by editing the
compatibility projection.
