Product: User Stories
Roles
- Student — the job seeker, has their own portal
- Verifier — reviews and approves student profile/resume content
- Admin L2 — manages a placement cycle, posts jobs
- Admin L1 — manages admins and verifiers, creates cycles
- Super Admin — full control of the tenant
Student stories
Authentication
- As a student, I can log in using my university Google account so I don't need a separate password
- As a student, I can log in using an email OTP if I don't want to use Google
- As a student, I am auto-registered when I first log in if my email matches the university domain rules
- As a student, I am shown a clear error message if my email is not recognised by the system
- As a student, I am automatically logged out after 30 days of inactivity
- As a student, I can log out from my current session
Profile
- As a student, I can fill in my personal details (name, roll number, batch, major, minor, category)
- As a student, I can add multiple education entries (school, undergraduate, other)
- As a student, I can add work experience with bullet point descriptions and upload proof documents for each entry
- As a student, I can add projects with descriptions and links
- As a student, I can add skills grouped by category
- As a student, I can add achievements and extracurricular activities
- As a student, I can add certifications and online courses
- As a student, I can see a profile completeness percentage so I know what to fill in
- As a student, I can see the verification status (unverified / pending / verified / rejected) for each section of my profile
- As a student, I can request verification for my profile sections once I've added proof documents
- As a student, I can see a verifier's comment if a section was rejected, so I know what to fix
- As a student, I can re-upload a proof document and re-request verification after a rejection
Resumes
- As a student, I can create a resume from my current profile (snapshot)
- As a student, I can create multiple resume variants for different job types
- As a student, I can toggle which sections appear on each resume
- As a student, I can reorder bullet points within a section
- As a student, I can edit individual bullet points on a resume (edited bullets are marked as needing re-verification)
- As a student, I can request AI rewriting of my resume tailored to a specific job
- As a student, I can see which bullet points have been modified by AI and are auto-verified
- As a student, I can request AI improvement suggestions (accept/reject each suggestion individually)
- As a student, I can name my resumes for easy identification
- As a student, I can delete a resume (unless it has been used in a submitted application)
Job browsing and applying
- As a student, I can browse all jobs posted in cycles I'm enrolled in
- As a student, I can search jobs by company name or role title
- As a student, I can filter jobs by sector, job type, CTC range, open/closed status, and whether I've applied
- As a student, I can see my eligibility status for each job (eligible / ineligible with reasons)
- As a student, I can see the deadline for each job clearly
- As a student, I can view full job details including description, company info, and requirements
- As a student, I can apply to a job by selecting one of my resumes
- As a student, I can optionally attach a cover letter when applying
- As a student, I can upload a video if the job requires it
- As a student, I cannot apply to a job I'm not eligible for (blocked with reason shown)
- As a student, I cannot apply to a job whose deadline has passed
- As a student, I can withdraw an application before the deadline (if withdrawal is allowed by admin)
- As a student, I can see the status of all my applications in one place
- As a student, I can see the full status history of each application (submitted → shortlisted → offered etc.)
- As a student, I can filter my applications by status, cycle, sector
Placement cycles
- As a student, I can see which placement cycles I'm eligible for
- As a student, I can self-enroll in a cycle when enrollment is open
- As a student, I can see which cycles I'm enrolled in on my dashboard
Events
- As a student, I can see upcoming PPTs, tests, and events
- As a student, I can see which events I've attended
- As a student, I can check in to an event by scanning the QR code shown at the event
- As a student, I can submit an exception request if I missed a required PPT with a reason
- As a student, I cannot apply to a job that requires PPT attendance if I haven't attended (and don't have an approved exception)
Dashboard
- As a student, I can see a summary of my application activity (total applied, shortlisted, offered)
- As a student, I can see upcoming deadlines in the next 7 days
- As a student, I can see my recent notifications
Verifier stories
- As a verifier, I can see only the students assigned to me (not all students)
- As a verifier, I can see a queue of pending verification requests from my assigned students
- As a verifier, I can view a student's profile section and proof documents side by side
- As a verifier, I can approve a verification request
- As a verifier, I can reject a verification request with a written comment to the student
- As a verifier, I can see my verification history (what I've approved/rejected and when)
- As a verifier, I can see a resume diff view when a student has edited an AI variant (showing exactly which bullets changed)
Admin L2 stories
- As an Admin L2, I can see all students in the system (not filtered to verifier scope)
- As an Admin L2, I can view a student's full profile, resumes, and applications
- As an Admin L2, I can create a student account manually
- As an Admin L2, I can edit a student's profile (including CGPA, education, major/minor)
- As an Admin L2, I can see all placement cycles I'm assigned to
- As an Admin L2, I can post jobs within my assigned cycles
- As an Admin L2, I can edit or delete jobs I've posted
- As an Admin L2, I can open/close applications for a job manually
- As an Admin L2, I can view all applications for jobs in my cycles
- As an Admin L2, I can update an application's status (shortlist / reject / offer)
- As an Admin L2, I can bulk download all applications for a job as a ZIP
- As an Admin L2, I can send a specific application to a recruiter's email
- As an Admin L2, I can create verifier accounts
- As an Admin L2, I can assign verifiers to students
- As an Admin L2, I can create events (PPTs, tests, workshops)
- As an Admin L2, I can mark student attendance manually for an event
- As an Admin L2, I can generate a QR code for an event to allow student self check-in
- As an Admin L2, I can bulk export the student list as CSV or Excel with configurable columns
- As an Admin L2, I can use the segmentation builder to query the student table with complex conditions
- As an Admin L2, I can save a segmentation query for reuse as a named filter
Admin L1 stories
All Admin L2 capabilities, plus:
- As an Admin L1, I can create placement cycles
- As an Admin L1, I can configure a cycle's eligibility (using segmentation)
- As an Admin L1, I can toggle enrollment open/close on a cycle
- As an Admin L1, I can bulk enroll students into a cycle via segmentation or CSV upload
- As an Admin L1, I can assign Admin L2 users to cycles
- As an Admin L1, I can create Admin L2 accounts
- As an Admin L1, I can approve or reject student PPT exception requests
- As an Admin L1, I can see analytics: applications by company/sector/CTC, placement funnel, year-over-year trends
- As an Admin L1, I can use the Student Intel view to run ad-hoc data queries on the student table
- As an Admin L1, I can post announcements visible to all students
Super Admin stories
All Admin L1 capabilities, plus:
- As a Super Admin, I can configure the tenant settings (domain rules, custom column labels, feature flags)
- As a Super Admin, I can upload or manage the email allowlist (CSV)
- As a Super Admin, I can create Admin L1 accounts
- As a Super Admin, I can assign and change any user's role
- As a Super Admin, I can create and revoke API keys for external integrations
- As a Super Admin, I can configure the external dossier API URL for fetching additional student data
- As a Super Admin, I can view the full activity log for any student
- As a Super Admin, I can deactivate any user account
- As a Super Admin, I can manually override a student's debarment status (clear or extend debarment)
- As a Super Admin, I can delete a student record permanently (with confirmation)
- As a Super Admin, I can see the AI-generated summary for any student
- As a Super Admin, I can trigger re-generation of a student's AI summary
Acceptance criteria checklist for critical flows
Apply to job
- Student must be enrolled in the job's cycle
- Student must match job's eligibility segmentation
- Job must be accepting applications
- Job deadline must not have passed
- If cycle has
noPptNoApply = true, student must have attended the linked PPT (or have an approved exception) - If student is debarred, show debarment reason and end date
- On submit: application record created, confirmation shown, email enqueued
- Student cannot apply to the same job twice (duplicate blocked at DB level)
OTP login
- OTP sent only to emails matching tenant domain rules
- OTP expires after 10 minutes
- Max 5 attempts before OTP is invalidated
- OTP is single-use (deleted from Redis on first successful verify)
- Correct OTP → tokens issued, user created if new
Resume verification flow
- Student edits a bullet on an AI variant → that bullet marked
unverified - Student requests verification → VerificationRequest created with the specific change keys
- Verifier sees only the changed bullets (not the whole resume)
- Verifier approves → those change keys removed from
unverifiedChangeKeys - Verifier rejects → student notified with comment, bullet stays unverified
- Student can still submit applications with an unverified bullet (soft warning, not hard block — configurable per tenant)
Segmentation evaluate
- Returns correct student count matching the definition
- Works with nested AND/OR groups
- Include/exclude individuals override group results
- Always scoped to tenant_id (never returns cross-tenant data)
- Returns summary stats (count, avg cgpa, breakdown by major)