# JobsBoard — Phase 10: Private Beta Operations Runbook ## Overview This runbook provides step-by-step procedures for platform operators during the Private Beta of JobsBoard. It covers user onboarding, invitation lifecycle management, feedback triaging, scraper operations, and emergency procedures. --- ## 1. Beta Invitation Management ### Creating Invitations Administrators can issue single-use cryptographic invitation tokens via the API or CLI: ```bash # Via API (Admin Session Required) curl -X POST http://localhost:3000/api/beta/invite \ -H "Content-Type: application/json" \ -H "Cookie: next-auth.session-token=" \ -d '{"email": "tester@example.com", "role": "SEEKER"}' ``` ```javascript // Via Node script / REPL const crypto = require("crypto"); const { PrismaClient } = require("@prisma/client"); const prisma = new PrismaClient(); async function issueInvite(email, role = "SEEKER") { const token = "beta_" + crypto.randomBytes(16).toString("hex"); const expiresAt = new Date(Date.now() + 14 * 24 * 60 * 60 * 1000); // 14 days return await prisma.betaInvitation.create({ data: { email: email.toLowerCase(), token, role, expiresAt } }); } ``` ### Tester Registration Flow 1. Tester visits: `https:///register?betaToken=beta_&email=tester@example.com` 2. Form automatically pre-fills email and verifies token validity upon submission. 3. Once registered, token is stamped with `usedAt: new Date()` and cannot be re-used. --- ## 2. Beta Feedback Triaging ### Viewing Tester Submissions All user reports (Bug, UI Problem, Search Problem, Job Data Problem, Feature Request) submitted via the floating **"Beta Feedback"** button are stored in the `BetaFeedback` table with diagnostic client metadata (`pageUrl`, `viewport`, `browserInfo`). Query recent feedback: ```sql SELECT id, category, description, "pageUrl", viewport, "createdAt" FROM "BetaFeedback" ORDER BY "createdAt" DESC LIMIT 20; ``` ### Triage Matrix | Category | Priority | Action Item | | :--- | :--- | :--- | | **BUG** | P1/P2 | Inspect logs via `grep -i "error" server.log` with correlation ID. Reproduce in staging. | | **JOB_DATA_PROBLEM** | P2 | Check `JobSource` and `SourceExecutionLog` for the job URL. Invalidate or mark stale. | | **SEARCH_PROBLEM** | P3 | Review search query tokens against normalized skills dictionary. | | **UI_PROBLEM** | P3 | Check tester's recorded `viewport` to reproduce responsive layout breakpoint. | | **FEATURE_REQUEST** | P4 | Log in product backlog for post-beta release planning. | --- ## 3. Scraper & Acquisition Operations ### Manual Job Pipeline Trigger To trigger an immediate ingest scan for a verified company (e.g. Greenhouse, Lever, Ashby): ```bash curl -X POST http://localhost:3000/api/admin/sources \ -H "Content-Type: application/json" \ -H "Cookie: next-auth.session-token=" \ -d '{"action": "TRIGGER", "sourceId": ""}' ``` ### Monitoring Scraper Health Inspect recent execution logs: ```bash curl -s http://localhost:3000/api/admin/sources \ -H "Cookie: next-auth.session-token=" | jq . ``` - **Job Expiration Safeguard**: Ensure consecutive missing scan count equals 3 before active jobs transition to `EXPIRED`. --- ## 4. Emergency Procedures ### Degraded Infrastructure Mode - If Redis fails: JobsBoard automatically falls back to in-memory sliding rate limiting and in-process background task queue. - If S3 is unreachable: Uploads fall back to container local filesystem storage (`/uploads/resumes`). - Check `/api/health` to view component statuses (`database`, `redis`, `storage`, `queue`).