Remaining Work (7 October 2026)
As of: 2026-09-22 · Release gate: AC01–AC21 (re-baselined), zero critical/high defects, blended cost ≤ $0.15/paid minute, Kevin sign-off.
Executive summary
| Dimension | Estimate |
|---|---|
| MVP scope | Auth, positions, candidates, day-window scheduling, credits/Stripe, live AI interview, proctoring, reports, retention, ops |
| Built | ~30–40% — core API/web, ledger, settlement, report generation; not launch-ready |
| Remaining | ~40–50 dev-days open tickets + ~15–25 dev-days FR19, load/capacity, qualification harnesses |
| Capacity (§18.6) | ≤ 270 build-hours; 120 QA-hours final week |
| Calendar | ~15 days to 7 Oct; feature freeze 29 Sep at risk |
Working today: Auth through schedule/reserve, candidate lobby/live (Daily), settlement + report Lambda consumers, Stripe credits; no production email, sweepers, report UI/PDF, or FR19. Identity: Firebase in code vs Cognito in spec (T-002).
Priority 1: Critical Path
| Feature / work item | What it does | Current state | Dependencies | Key files / modules | Risk |
|---|---|---|---|---|---|
| Email + ICS invitation system | Candidate day-window invite + .ics; team invite emails | 🔴 Not started (dev logger only) | SMTP/SES, WEB_BASE_URL, branding | apps/api/src/modules/interviews/invitations/*, T-017 | High |
| Notification system (async email) | Report-ready/failed, funding alerts, completion, retention warnings | 🔴 Not started | T-017 queue + consumer | infra/queues.ts, T-017 | High |
| Interview expiry sweeper | Expire scheduled past expiresAt; release credits; notify | 🔴 Not started | Credit release, T-017 | interview.model.ts, T-018 | High |
| Credit lot expiry sweeper | Forfeit unreserved credits on expired lots | 🟡 Partial (expireLot; no scheduler) | T-009 | credit.service.ts, T-018 | High |
| Short-session deterministic result | <60s or <2 substantive answers → insufficient evidence | 🟢 Implemented | Bot transcript/substantiveAnswers | report-generation.service.ts | Low |
| Abuse controls (short-session blocking) | Block wallet gaming on ultra-short sessions | 🔴 Not started | Settlement + thresholds | §15 | Medium |
| Proctoring + credibility pipeline (FR19) | Detectors + AI-likeness → credibility score | 🔴 Not started (schema only) | G0b; bot + PATCH proctoring | cleverhire-bot, bot-interview.service.ts | High |
| PDF + evidence export | Recruiter PDF; evidence bundle with expiring URLs | 🔴 Not started | Report data, S3 | T-015 | High |
| Report viewing UI | Skills, transcript, integrity, recording, export | 🔴 Not started | T-014 | apps/web, T-015 | High |
| Recording management | Lifecycle, playback URLs, purge | 🟡 Partial (Daily enabled; no bucket/lifecycle) | Daily, retention sweeper | daily.service.ts, infra/storage.ts | High |
| Data retention purge pipeline | Purge at retentionExpiresAt; warnings | 🔴 Not started | T-018 + T-017 | data-lifecycle.md | High |
| Reconciliation job (cache vs ledger) | Daily compare; alarm on drift | 🔴 Not started | T-009 | T-018 | High |
| Capacity scaling (3 → 10 concurrent bots) | Platform 10, 3/workspace; soak + 100-session qual | 🔴 Not met (default 3) | Bot max_concurrent_bots | cleverhire-bot/server/services/bot_manager.py | High |
| Bot E2E production path | Sophia adapter + stable BOT_BASE_URL | 🟡 Partial | cleverhire-bot tenant router | bot-interview.service.ts | High |
| QA contract re-baseline | Align AC/WP with day-window + ICS | 🔴 Open | Spec lock v0.5 | PRODUCT_CONTEXT.md Q13 | High |
| Wallet qualification (WAL01–WAL24) | ≥1k sequences + fault injection | 🔴 Not started | Settlement + sweepers | §15.1 | High |
| Proctoring qualification (PRO + held-out set) | Detector metrics, 10× concurrent | 🔴 Not started | FR19 | §15.2 | High |
| CloudWatch alarms + DLQ ops | DLQ depth, reconciliation drift, stall ≤60s | 🔴 Not started | Infra + runbooks | infra/, monitoring.md | Medium |
| Internal contract docs + adapter tests | Versioned events/API for ATS | 🟡 Partial (Zod only) | Stable bot/API | FR18, C14 | Medium |
| Cluster | Tickets / work | Est. |
|---|---|---|
| Notifications + ICS | T-017 | 4d |
| Sweepers + reconciliation | T-018 | 3d |
| Report UI + export | T-015 | 4d |
| FR19 proctoring (engineering + qual) | WP25 / not ticketized | 10–20d |
| Capacity 3→10 + soak + 100-session | Load qual | 5–8d |
| WAL + fault injection harness | QA engineering | 5–8d |
| Bot adapter E2E hardening | T-012 remainder | 3–5d |
Priority 2: Should Have
| Feature / work item | What it does | Current state | Dependencies | Key files / modules | Risk |
|---|---|---|---|---|---|
| Operator console | DLQ replay, org lookup, credit adjustments | 🔴 Not started | Auth/RBAC | FR17 | Medium |
| Cost monitoring / alerting | Blended $/minute toward $0.15 gate | 🔴 Not measured | Bot costMetrics | nfr-and-quality-gates.md | High |
| Interview reminder emails | 24h before window expiry | 🔴 Not started | T-017 | FR15 | Medium |
| WAL01–WAL24 automated coverage | Deterministic wallet tests | 🔴 Not started | P1 settlement/sweepers | §15.1 | High |
| Chargeback / funding deficit | Chargeback → deficit; block commits | 🔴 Not started | Stripe webhooks | credit.service.ts | Medium |
| Credit restoration flow | WAL13 remedies | 🔴 Not started | Operator + ledger | §8 | Medium |
| Resume validation (scanned-only rejection) | Block unreadable résumé at schedule | 🟡 Partial | UX + validation | interview.service.ts | Low |
| Error analytics | Structured error rates, SLOs | 🟡 Partial (Pino only) | CloudWatch | observability.ts | Medium |
| Settings + org branding (T-016) | Admin settings + email branding | 🔴 Not started | T-017 | T-016 | Medium |
| Disconnect → abandoned sweeper | disconnected >3 min → abandoned + settle | 🔴 Not started | T-018 | T-018 | Medium |
| Workspace concurrent cap (3) | Per-org live limit | 🔴 Not started | Bot/API | FR17 | Medium |
| Provider evidence cleanup (72h) | Deletion attestation | 🔴 Not started | Runbooks | §22.4 | Medium |
| On-call + runbooks | DLQ, report retry, rollback | 🔴 Not started | Operator console | documentation-gaps.md | Medium |
| Identity spec alignment | Cognito vs Firebase | 🟡 Drift | ADR | T-002, T-003 | Medium |
Priority 3: Can Ship Without
| Feature / work item | What it does | Current state | Dependencies | Key files / modules | Risk |
|---|---|---|---|---|---|
| Public product / pricing / help / policy pages | Marketing-lite (C03) | 🔴 Not started | Static pages | §3.1 item 14 | Low |
| Sample report | Demo without live credits | 🔴 Not started | T-015 | — | Low |
| Enhanced PDF styling | Polished export | 🔴 Not started | T-015 | — | Low |
| Bulk CSV/XLSX scheduling | 100-row import | 🔵 OPEN | Q14 | C10/FR06 | Medium if promised |
| In-product notification bell | FR15 in-app | 🔴 Out of v1 | — | — | Low |
Phase 2 (Post-Launch)
| Item | Notes |
|---|---|
| Dual camera / phone QR companion | G6 / Phase 2 |
| Enterprise SSO (SAML/Okta/Entra) | Excluded Phase 1 |
| ATS integrations + production CleverHire adapter | G5 |
| Apple / Microsoft sign-in | Deferred from C09 |
| Custom domains / white labelling | Out of scope Phase 1 |
| Enhanced pricing tiers | Phase 2 |
| Template library | Dropped |
| Google / Microsoft calendar | Dropped |
Dependencies Graph
flowchart TB
subgraph foundation [Foundation - largely done]
AUTH[Auth + workspace]
MODELS[Models + contracts]
POS[Positions]
CAND[Candidates + resume]
CRED[Credits + Stripe]
SCHED[Interview schedule + reserve]
end
subgraph p1_core [P1 critical path]
EMAIL[T-017 Email + ICS + alerts]
SWP[T-018 Sweepers + reconciliation]
BOT[Bot E2E + capacity 10]
PROC[FR19 Proctoring + credibility]
RPTGEN[Report generation - done]
RPTUI[T-015 Report UI + PDF/evidence export]
RET[Retention purge + recording lifecycle]
QA[QA re-baseline + WAL/PRO qual]
end
subgraph p2 [P2 should have]
OPS[Operator console + runbooks]
MON[Cost monitoring + alarms]
SET[T-016 Settings/branding]
CB[Chargeback + restoration]
end
AUTH --> SCHED
POS --> SCHED
CAND --> SCHED
CRED --> SCHED
SCHED --> EMAIL
SCHED --> SWP
SCHED --> BOT
BOT --> PROC
BOT --> RPTGEN
CRED --> SWP
SWP --> EMAIL
RPTGEN --> RPTUI
PROC --> RPTUI
SWP --> RET
RET --> EMAIL
RPTUI --> QA
SWP --> QA
PROC --> QA
BOT --> QA
EMAIL --> SET
SWP --> OPS
CRED --> CB
MON --> QACritical path: Schedule → Bot E2E → Proctoring → Report UI/export → WAL/PRO qual → Release.
Risks & Blockers
| # | Risk | Impact | Mitigation status |
|---|---|---|---|
| 1 | Detector feasibility (FR19) | Release blocker | 🔴 G0b; hybrid design not implemented |
| 2 | Capacity 3 → 10 | AC load gates fail | 🔴 max_concurrent_bots=3 |
| 3 | Cost gate ≤ $0.15/paid minute | Commercial blocker | 🔴 Not measured |
| 4 | FR18 extraction risks | Data/billing bugs | 🟡 Settlement idempotent; rest partial |
| 5 | Bot coupling | Dual-product outage | 🟡 No versioned adapter |
| 6 | Spec / QA drift | False “done” | 🔴 Re-baseline OPEN (Q13) |
| 7 | Cross-tenant leak | Severity-1 | 🟡 No AC03 suite |
| 8 | Cache vs ledger drift | Billing corruption | 🔴 Reconciler not running |
| 9 | Stripe / entity / tax | Cannot sell | 🟡 External; code exists |
| 10 | Report quality / integrity over-claim | Trust/legal | 🟡 Qual not run |
| 11 | PRODUCT_CONTEXT §25 stale | Planning error | 🟡 Use generated docs + this file |
Schedule: Feature freeze 29 Sep / G3 6 Oct assume §18.1 complete; ~60–65% work remains — re-baseline milestones (Kevin/Salman).
Tickets Reference
| Ticket | Title | Priority | Status (2026-09-22) | Remaining work |
|---|---|---|---|---|
| T-001 | Database models + contracts | P0 | 🟢 Mostly done | v2 fields, proctoring tuning |
| T-002 | Auth infrastructure | P0 | 🟡 Done (Firebase) | Cognito ADR |
| T-003 | Signup + workspace | P0 | 🟢 Done | Trial credits config |
| T-004 | Login + recovery | P0 | 🟢 Done | — |
| T-005 | Team invites | P0 | 🟡 Partial | Invite email (T-017) |
| T-006 | Positions | P0 | 🟢 Done | — |
| T-007 | Candidates + resume | P0 | 🟢 Done | Scanned-only gate |
| T-008 | Notes | P1 | 🟢 Done | — |
| T-009 | Credits + Stripe | P0 | 🟡 Mostly done | Chargeback; lot sweeper |
| T-010 | Scheduling + reserve | P0 | 🟡 Mostly done | Production invitation |
| T-011 | Candidate journey | P0 | 🟡 Mostly done | FR19 gates; browser QA |
| T-012 | Bot + runtime | P0 | 🟡 Partial | Production router; proctoring |
| T-013 | Settlement consumer | P0 | 🟢 Done | WAL fault tests |
| T-014 | Report generation | P0 | 🟢 Done | — |
| T-015 | Report UI + export | P0 | 🔴 Not started | Full scope |
| T-016 | Settings + branding | P1 | 🔴 Not started | API + /settings |
| T-017 | Notifications | P1 | 🔴 Not started | P1 launch |
| T-018 | Sweepers | P1 | 🔴 Not started | P1 launch |
| T-019 | App shell | P1 | 🟢 Done | Settings when T-016 |
| T-020 | Interviews CRUD | P0 | 🟢 Done | Swap ports as needed |
Focus order: T-017 → T-018 → Bot E2E + capacity → FR19 MVP → T-015 → WAL/PRO + QA re-baseline → T-016 + monitoring.