Skip to content

Implementation Tracker (Phase 1 MVP) ​

As of: 2026-09-22 Β· Spec: PRODUCT_CONTEXT.md

Legend: 🟒 Done Β· 🟑 Partial Β· πŸ”΄ Not Started Β· βšͺ Dropped Β· πŸ”΅ Open/TBD


Summary Statistics ​

MetricCountShare
Total requirements tracked58100% (C01–C18 + FR01–FR19 + AC01–AC21)
🟒 Done23%
🟑 Partial2848%
πŸ”΄ Not Started1322%
βšͺ Dropped916%
πŸ”΅ Open / TBD610%

Product Boundary Requirements (C01–C18) ​

IDRequirementStatusEvidence / NotesSource
C01Standalone SaaS; separate deployment, credentials, data boundaries🟑 PartialSophia monorepo + own Mongo/S3/Stripe/Fargate path; shared cleverhire-bot and no production CleverHire adapter. Independence gate AC16 not qualified.§3.1(1), §7.1, AC16
C02Public self-service signup without routine Highbrow activation🟒 DonePOST /v1/auth/signup, Google signup, workspace creation (auth.routes.ts, auth.service.ts). ONBOARDING still says sales-led β€” stale.Β§3.1(2), Β§7.1 C02, Β§23.1
C03Stripe USD checkout; public product/pricing/help/policy pages🟑 PartialStripe Checkout + webhook (credit.routes.ts, stripe-webhook.routes.ts). No public marketing/pricing/help/policy pages or sample report in apps/web.§3.1(3), §12.3
C04Prepaid minute credits; max-duration reserve; charge actual usage🟑 PartialLots, ledger, reserve/settle/release (credit.service.ts, LedgerCreditsProvider). Trial grant optional (TRIAL_CREDITS_*) β€” conflicts with β€œno free live credits” when enabled.Β§3.1(9), Β§7.1 C04, Β§8.1
C05Exactly two roles: admin and member; creator starts admin🟒 DoneEUserRole.ADMIN / MEMBER in @sophia/shared; first signup user is admin.§7.1 C05, §23.2
C06Members: own interviews only; no private billing🟑 PartialCredit routes admin-only; billing UI gated. Interview list/detail not filtered by createdBy for members (interview.routes.ts comment vs interview.service.ts).§7.1 C06, §4.2
C07Admins: all interviews, team, billing, per-scheduler usage🟑 PartialTeam, credits summary/history/lots, admin delete interview. No usage/spend CSV export API.§7.1 C07, FR14
C08One workspace/account; last-admin protection; immediate role effects🟑 PartialcountActiveAdmins + team demotion guards (team.service.ts). Multi-workspace per account / immutable creator not fully verified.§7.1 C08, §6.2
C09Cognito; Google + email/password; no enterprise SSO🟑 PartialFirebase Auth + Google (auth.firebase.ts) β€” functional overlap, spec mismatch vs Cognito.Β§7.1 C09, Β§23, T-002
C10Shared templates + bulk schedulingπŸ”΅ Open / βšͺTemplates βšͺ dropped (10 Sep). Bulk CSV/XLSX fate unresolved β€” no bulk UI/API.Β§7.1 C10, D13, D26, Q14
C11Google/Microsoft calendar; slots; self-bookingβšͺ DroppedDay-window + ICS email replaces calendar integration.Β§7.1 C11, D14
C12English 1:1 AI interview; 5/10/15/20/30 min (default 20)🟑 PartialDuration on positions/interviews; candidate live via Daily + bot session. Full browser matrix / enforcement not qualified.§7.1 C12, contracts
C13Sofia first; CleverHire consumes service laterπŸ”΅ OpenStrategy tension with AGENTS.md module rule (Β§23.3). No production adapter.Β§7.1 C13, G5
C14Broad ATS compatibility later phaseπŸ”΅ OpenZod contracts only; no adapter tests shipped.Β§7.1 C14, FR18
C15First-time user/candidate usability as release gateπŸ”΄ Not StartedNo recorded 5-participant usability qual (AC19).Β§7.1 C15, Β§17.3
C16Delivery ownership, four-week plan, QA weekπŸ”΅ OpenProcess/meta; milestones need re-baseline (Β§18.6).Β§7.1 C16
C17Competitive pricing; viable measured costπŸ”΄ Not StartedPrices in spec; no blended $0.15/min measurement in repo.Β§7.1 C17, Β§17.4
C18Phase 1 phone/person/eye + credibility; dual camera Phase 2πŸ”΄ Not Startedproctoring.credibility schema + PATCH from bot; no FR19-grade detectors in Sophia web. Dual camera correctly out of scope.Β§7.1 C18, FR19, Β§23.11

Functional Requirements (FR01–FR19) ​

IDRequirementStatusEvidence / NotesSource
FR01Signup/join: public signup, workspace, first admin; invitee joins intended workspace🟑 PartialSignup + Google + verify flows; team invite accept (AcceptInvitePage.tsx). Invite email dev-only (DevInvitationProvider).Β§7.2 FR01, Β§6.1–6.2
FR02Accounts: reset, verification resend, logout; no unsafe identity merge🟑 PartialFirebase client flows + API logout/revoke; linking rules not fully tested.§7.2 FR02
FR03Membership conflicts: no auto-transfer; no domain auto-join🟑 PartialSingle org per user model; edge cases not qualified.§7.2 FR03
FR04Calendar consent separationβšͺ DroppedCalendar integration removed.Β§7.2 FR04
FR05Shared recruiter templatesβšͺ DroppedPositions replace template library.Β§7.2 FR05, D13
FR06Bulk CSV/XLSX schedulingπŸ”΅ OpenNot implemented; fate undecided (Q14).Β§7.2 FR06, D26
FR07Draft caps, resend limits, immutability after sendπŸ”΅ OpenResend rate limit in API; draft/staging caps not enforced.Β§7.2 FR07, Β§5.16
FR08Calendar integrationβšͺ Droppedβ€”Β§7.4
FR09Appointments / self-bookingβšͺ DroppedDay-window model instead.Β§7.4
FR10Candidate runtime: private pages, consent, screen share, recovery, FR19 detectors🟑 PartialJoin, lobby, device checks incl. screen share (useDeviceChecks.ts), Daily live. No phone/person/true gaze; not full browser matrix.§7.5 FR10
FR11Calendar/appointments (continued)βšͺ Droppedβ€”Β§7.4
FR12Results: honest skills, transcript, recording, integrity, notes, PDF/export🟑 PartialReport generation with assessed + insufficient_evidence (report-generation.service.ts). No report UI, PDF, or evidence export routes.§7.5 FR12, T-015
FR13Credits/commercial packs; integer credit-seconds; charge rules🟑 PartialPacks via Stripe; ledger types; settle charges floor(seconds/60). Chargeback/deficit not built.§7.6 FR13
FR14Admin billing dashboard, alerts, member funding messages🟑 PartialBilling page + ledger; funding alerts / member-only messaging incomplete.§7.6 FR14
FR15Email + in-product notificationsπŸ”΄ Not StartedNo notification consumer; T-017 open.Β§7.7 FR15
FR16Retention, export windows, purge, holds🟑 PartialretentionExpiresAt on interview; settlement sets default 60d. No purge sweeper, export pipeline, or holds.§7.7 FR16, T-018
FR17Ops: capacity limits, monitoring, operator console, support rosterπŸ”΄ Not StartedNo operator routes; no 10/3 concurrency enforcement; no on-call artifacts in repo.Β§7.7 FR17
FR18Extraction: versioned contracts, adapter tests, reuse bot pipeline🟑 PartialBot context/start/complete routes; shared Zod contracts. No adapter contract test suite; bot still CleverHire-coupled in prod.§7.8 FR18
FR19Phase 1 proctoring: phone/person/eye + credibility (amended)πŸ”΄ Not StartedProctoring blob + credibility fields on model; no qualifying detector pipeline in Sophia.Β§7.9 FR19, D16–D17

Acceptance Criteria (AC01–AC21) ​

IDRequirement (summary)StatusEvidence / NotesSource
AC01Public signup β†’ workspace β†’ first admin; resumable abandoned signup🟑 PartialSignup + org + admin role implemented; resumable signup not qualified.Β§6.1, AC01/AC02 refs
AC02Invitee joins intended workspace/role; safe identity linking🟑 PartialInvite accept flow; email delivery stub; takeover edge cases not tested.§6.2, §7.2
AC03Two workspaces; tamper across APIs/files β€” zero leakage; member billing isolationπŸ”΄ Not StartedOrg-scoped repos + rules; no automated AC03 suite; member interview scope gap (C06).Β§16.1, Β§17.3
AC04One-workspace / invite conflict handling🟑 PartialTeam service + invite expiry fields; full WAL22 scenarios not run.§6.2
AC05Positions, candidates, schedule prepared inputs (rΓ©sumΓ©, skills-fit)🟑 PartialCRUD + skills validation + resume upload; readability gate partial.Β§6.4–6.6, FR07 survivors
AC06Bulk import scheduling (100 rows)βšͺ DroppedPending Q14 / QA re-baseline.Β§3.3, Q13
AC07Google Calendar integrationβšͺ Droppedβ€”Β§3.3, Q13
AC08Candidate self-booking / slotsβšͺ DroppedDay-window replaces.Β§3.3, Q13
AC09Preflight failures β†’ no live charge🟑 PartialBilling starts at live session; preflight not wired to meter end-to-end qual.Β§6.7, WAL08
AC10Live session, disconnect/recovery, terminal state + transcript preserved🟑 PartialBot disconnect/rejoin routes; disconnected status on model; sweeper for abandoned not built.Β§6.8–6.9, T-018
AC11Wallet / ledger invariants (WAL01–WAL24 subset)🟑 PartialAtomic reserve/settle, Stripe idempotency; β‰₯1k sequence qual not run.Β§15.1
AC12Stripe purchase, webhook grant once, pending/failed grant nothing🟑 Partialstripe-webhook.routes.ts, duplicate handling; full WAL01–02 not qualified.Β§6.3
AC13Day-window scheduling + invitation (ICS)🟑 PartialexpiryDays 7/14, window on interview; ICS + production email not sent.§6.6, D14
AC14Report quality: evidence, insufficient-evidence, no fabricated skills🟑 PartialLLM prompt enforces assessed; human β‰₯20-review gate not run.Β§6.11, Β§17.3
AC15Retention notices, export before purge, deletion/holdπŸ”΄ Not StartedRetention timestamp only; no purge/export/hold jobs.Β§6.14, FR16
AC16Independence: CleverHire blocked; full paid journey on Sophia only🟑 PartialData/API on Sophia; bot dependency + no formal AC16 test bundle.§5.17, §10.10
AC17Measured blended cost ≀ $0.15/paid minute (release gate)πŸ”΄ Not StartedNo cost qualification artifact.Β§3.3, Β§17.4
AC18Platform failure injection: alerts ≀60s, replay, backup/runbooksπŸ”΄ Not StartedSQS DLQ infra; no fault-injection qual or runbooks in repo.Β§15.3
AC19Usability: 5 first-time users, β‰₯4/5 core tasks without coachingπŸ”΄ Not Startedβ€”Β§17.3, Q31
AC20Load: 10 concurrent (3/workspace), soak, 100-session day mixπŸ”΄ Not StartedBot default 3 cluster-wide; no qual harness.Β§17.2
AC21Proctoring qualification (PRO01–10, held-out set, false escalation)πŸ”΄ Not StartedFR19 not implemented to gate level.Β§15.2, Β§17.3, Q15

Decisions Register (D1–D28) ​

IDDecisionSpec statusImplemented?Conflicts / notes
D1Standalone public SaaSFINAL🟑 PartialOwn stack yes; shared bot + no AC16 sign-off.
D2Reuse shared Python botFINAL🟑 PartialBot routes in API; production E2E incomplete.
D3Single shared DB + organizationIdFINAL🟒 DoneModels/repos follow data-access rules.
D4Ledger + cached org credits + reconcilerPROVISIONAL🟑 PartialCache + ledger yes; reconciler job missing (T-018).
D5Reserve at schedule, settle at end, settledAt claimFINAL🟒 Donesettlement.service.ts, credit reserve in schedule.
D6Charge actual seconds, not reserved maxFINAL🟑 PartialSettlement uses elapsed seconds; WAL matrix not qualified.
D7Frozen snapshot at scheduleFINAL🟒 Donesnapshot on interview; schedule copies resume text.
D8joinTokenHash on interviewPROVISIONAL🟒 DoneHash stored; password + session token flow.
D9One candidates collectionFINAL🟒 DoneCandidate module + per-org email unique.
D10assessed + insufficient_evidenceFINAL🟒 DoneReport generation + Zod contracts.
D11deletedAt soft deletePROVISIONAL🟒 DoneUsed on core entities.
D12Integer credit-secondsFINAL🟑 PartialLedger integers; display rounding rules partial in UI.
D13Templates droppedFINALβšͺ N/APositions only.
D14Day-window + ICS; calendar droppedFINAL🟑 PartialWindow in code; ICS email not production.
D15Google + email Phase 1; no SSOFINAL🟑 PartialFirebase not Cognito.
D16Hybrid eye + AI-likeness β†’ credibilityFINALπŸ”΄ Not StartedSchema only.
D17Phone/person/eye remain Phase 1FINALπŸ”΄ Not Startedβ€”
D18Dual camera Phase 2FINALβšͺ N/ACorrectly out of scope.
D19positionId requiredFINAL🟒 DoneInterview model requires position.
D20Separate interviewReportsFINAL🟒 DoneReport model + generation consumer.
D21Transcript in Mongo for nowPROVISIONAL🟒 DoneInline on report document.
D22Free-text tags ~20 maxPROVISIONAL🟑 PartialCandidate tags; convention not enforced in schema.
D23Global-unique user emailPROVISIONAL🟒 DoneUnique index on user email.
D24disconnected + failureReason enumPROVISIONAL🟒 DoneOn interview model/status enum.
D25Skills + aiContext on positionPROVISIONAL🟒 DonePosition create + snapshot skills.
D26Bulk scheduling undecidedTBDπŸ”΅ OpenNo implementation.
D27Role naming admin/memberTBD🟒 DoneCode uses admin/member (Q21 effectively resolved in code).
D28Rejoin state embedded on interviewTBD🟒 Doneruntime subdocument on interview.

Open Questions (Q1–Q32) ​

IDQuestionStatus in code / product
Q1Global vs per-org user emailResolved in code: global unique (D23).
Q2Store positions.description for botResolved: snapshot + bot context use JD text.
Q3Transcript Mongo vs S3Resolved for now: Mongo on report (D21).
Q4interviewSessions collectionResolved in code: embedded runtime (D28).
Q5credits.consumed roundingResolved by spec: floor seconds at settlement.
Q6Tags free-text vs managedOpen: free-text in code; degeneration accepted (D22).
Q7seniority field valueOpen: kept; maps to experience level in practice.
Q8Rejoin embedded vs collectionResolved: embedded (D28).
Q9Pin botType providerOpen: field exists, default openai.
Q10ICS shape + reminder timing for windowsOpen: invitation subdoc; no production ICS.
Q11Eye-tracking on-device vs cloudOpen: D16 not implemented.
Q12Spec v0.5 lock dateOpen: blocks formal QA sign-off.
Q13QA contract re-baselineOpen: AC06–08 still in PDF appendix.
Q14Bulk CSV fateOpen: not built.
Q15AC21/PRO gates after credibility redesignOpen: engineering must re-validate.
Q16Credibility threshold + compute locationOpen: no production logic.
Q17Candidate reschedule/cancel on window modelOpen: likely N/A; confirm with Kevin.
Q18No-show / late entry semanticsOpen: expired window = no-show in working theory.
Q19Default window length optionsPartial: org default 7; UI allows 7/14.
Q20Candidate password/challenge storagePartial: join password on interview; security review open.
Q21admin/member vs owner/memberResolved in code as admin/member; docs lag (Β§23.2).
Q22Self-serve vs sales-ledResolved by product: self-serve; ONBOARDING stale.
Q23Ownership matrixOpen: follow PDF Appendix B; update ONBOARDING.
Q24Module inside CleverHire vs consumed serviceOpen: packages/ neutrality rule binds.
Q253 β†’ 10 concurrent botsOpen / blocker: not implemented.
Q26Redis roleOpen: not used in Sophia code paths.
Q27Which LLM paths run for reportsOpen: OpenAI in report consumer; duplicate analysis not mapped.
Q28Contract versioning for ATSOpen: /v1 only.
Q29Admin 2FA / operator hardeningOpen: not discussed in spec as required.
Q30QA $500 / infra $500 approvalOpen: process/budget.
Q31Proctoring + usability participant recruitmentOpen: AC19/AC21 blockers.
Q32Who runs fresh held-out qual after detector fixOpen: ownership unassigned.

Sophia AI Interview Platform β€” Internal Documentation