JB/BETA_RUNBOOK.md

93 lines
3.6 KiB
Markdown

# 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=<ADMIN_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://<domain>/register?betaToken=beta_<token_hex>&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=<ADMIN_TOKEN>" \
-d '{"action": "TRIGGER", "sourceId": "<SOURCE_ID>"}'
```
### Monitoring Scraper Health
Inspect recent execution logs:
```bash
curl -s http://localhost:3000/api/admin/sources \
-H "Cookie: next-auth.session-token=<ADMIN_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`).