Non-functional requirements & quality gates β
As of: 2026-09-22
| Symbol | Meaning |
|---|---|
| π’ Met | Evidence in code, infra, or qualification |
| π‘ Partially Met | Building blocks; target not demonstrated |
| π΄ Not Measured / Not Started | No harness or not implemented |
| π΅ N/A | Dropped or out of Phase 1 |
1. Performance & Latency β
| Metric | Target | Status | Evidence / gap |
|---|---|---|---|
| Core app p95 response | < 2 s (excl. uploads/jobs) | π΄ Not Measured | durationMs logged; no p95 gate |
| Stalled live-service detection | β€ 60 s | π΄ Not Started | FR17 / AC18 |
| Report readiness after end | p95 β€ 10 min; p99 β€ 30 min | π΄ Not Measured | 5 min Lambda timeout; no SLO tracking |
| Recording availability after end | p95 β€ 30 min | π΄ Not Measured | No age metrics |
| End-of-turn to bot audio | p95 β€ 3 s | π΄ Not Measured | Bot pipeline; not in Sophia repo |
| Live incident availability (proctoring) | p95 β€ 5 s | π΄ Not Started | FR19 not productized |
| Detector failure recognition | β€ 10 s | π΄ Not Started | PRO05βPRO10 |
| Scheduling usability | β€ 3 min | π΄ Not Measured | β |
| Candidate preflight usability | β€ 3 min | π΄ Not Measured | β |
| Calendar sync | β€ 2 / 5 min | π΅ N/A | Dropped |
2. Scale & Load β
| Target | Requirement | Status | Evidence / gap |
|---|---|---|---|
| Platform concurrent live | 10, β₯4 workspaces | π΄ Not Met | Bot default 3 |
| Per-workspace cap | 3 | π΄ Not Started | No enforcement in API |
| Soak test | 90 min | π΄ Not Started | β |
| Daily workload qual | 100 sessions/day | π΄ Not Started | β |
| 100-session mix composition | Durations, shortened, failures, reviewed normals | π΄ Not Started | β |
| Bulk import | 100 rows | π΅ N/A / π΄ | Bulk OPEN |
| Code reality 3 bots cluster-wide | Documented | π’ Met | Contradicts release 10 |
| 11th / 4th reject without harming confirmed | β | π΄ Not Started | HTTP 429 cluster only |
| API scale ECS min 2 max 6 | CPU/memory targets | π‘ Partially Met | infra/api.ts |
| Overload blocks new, not confirmed | FR17 | π΄ Not Started | β |
3. Quality Gates β
| Gate | Target | Status | Notes |
|---|---|---|---|
| Phone detection | β₯90% recall, β₯95% precision | π΄ Not Started | FR19 |
| Person detection | β₯90% / β₯95% per category | π΄ Not Started | Held-out β₯100 events |
| Eye/gaze | β₯85% sens/spec; macro-F1 β₯0.80 | π΄ Not Started | Credibility redesign OPEN |
| Report quality | β₯20 human reviews; zero fabrication | π΄ Not Started | Pipeline exists |
| Usability | 5 users; β₯4/5 tasks | π΄ Not Started | β |
| Wallet sequences | β₯1,000 randomized + invariants | π΄ Not Started | Β§15.1 |
| False escalation | β€5% clean sessions | π΄ Not Started | Β§15.2 |
| WAL01βWAL24 matrix | Per scenario | π΄ Not Started | β |
| PRO05βPRO10 failures | β€10 s recognize; block/pause | π΄ Not Started | β |
| Held-out evaluation set | Phone/person/gaze/failures/clean | π΄ Not Started | Β§15.2 |
| 10 simultaneous + detectors | Pass audio/recording/cost | π΄ Not Started | β |
| Eye calibration usability | β₯95% without engineering | π΄ Not Started | β |
| AC03 isolation | Zero leakage | π΄ Not Started | Β§16.1 |
4. Cost & Commercial β
| Metric | Target | Status | Evidence / gap |
|---|---|---|---|
| Planning variable cost | $0.15/paid minute | π΄ Not Measured | β |
| Stress variable cost | $0.25 p95 session | π΄ Not Measured | β |
| Release gate blended | β€ $0.15 or exception | π΄ Not Started | β |
| Fixed infra launch budget | $500/month proposed | π‘ Partially Met | ~$88.50 Fargate ref |
| QA provider budget | $500 proposed | π΄ Not Started | Process |
| Alert rolling > $0.15/min | β | π΄ Not Started | Β§8.3 |
| Alert p95 > $0.25/min | β | π΄ Not Started | β |
| Incident spend protection | Pause bookings | π΄ Not Started | WAL23 |
| Reference component costs | Planning table | π΅ N/A | Β§17.4 |
| Break-even illustrations | Finance | π΅ N/A | Β§17.4 |
5. Reliability & Consistency β
| Requirement | Status | Evidence / gap |
|---|---|---|
| Money ops atomic + idempotent; balances β₯ 0 | π‘ Partially Met | credit.service.ts, transactions |
| WAL01βWAL24 replay/concurrency | π‘ Partially Met | Webhook idempotency; matrix not qual |
| Retries + DLQ review | π‘ Partially Met | SQS DLQ; no alarms/replay tooling |
| Replay no duplicate charges | π‘ Partially Met | Not fault-injection proven |
| Backup/rollback runbooks | π΄ Not Started | SST retain; no runbooks |
| Reconciliation cache vs ledger | π΄ Not Started | Comment in credit.repo.ts |
| AC03 zero cross-tenant | π‘ Partially Met | Repo discipline; no suite |
| Global DB rules (integer money, tenant indexes) | π‘ Partially Met | Models/repos |
| Partial SQS batch failures | π’ Met | partialResponses: true |
| Production Mongo required at startup | π’ Met | /health degraded when down |
6. Availability & Support β
| Requirement | Status | Evidence / gap |
|---|---|---|
| Support MonβFri 09:00β18:00 IST | π΄ Not Started | Process |
| Acknowledgement 1 business day | π΄ Not Started | β |
| No 24/7 SLA | π΅ N/A | Policy |
| Named on-call roster | π΄ Not Started | FR17 |
| Candidate self-service recovery | π‘ Partially Met | Join flows partial |
| Contract tests + real-payment smoke | π‘ Partially Met | Vitest; smoke not documented |
| Stripe test mode replay paths | π‘ Partially Met | Webhook verify |
ALB /health | π’ Met | infra/api.ts |
| Production min 2 Fargate tasks | π’ Met | infra/api.ts |
7. Security (Β§16) β
| Requirement | Status | Implementation notes |
|---|---|---|
| Auth Cognito + Google + email | π‘ Partially Met | Firebase in code |
| Verification, reset, logout | π‘ Partially Met | Firebase routes |
| Candidate expiring scoped credentials | π‘ Partially Met | Join token, session token |
| Authorization every request; immediate role change | π‘ Partially Met | requireAuth / requireAdmin |
| Member own / admin workspace / candidate surfaces | π‘ Partially Met | AC03 pending |
| No cross-workspace access | π‘ Partially Met | Tenant repos |
| Tenant isolation indexes | π‘ Partially Met | data-access rules |
| Phone encrypted; scoped URLs β€5 min | π‘ Partially Met | Export flow not started |
| Operator audit; ledger corrections | π΄ Not Started | Ledger append-only π‘ |
| Data lifecycle purge / legal hold | π΄ Not Started | retentionExpiresAt only |
| AC03 isolation test | π΄ Not Started | β |
| Logs exclude PII content | π‘ Partially Met | Pino redaction |
| Security headers + CORS | π’ Met | secureHeaders() |
| Stripe webhook HMAC | π’ Met | β |
| Bot internal token | π’ Met | x-internal-token |
| Rate limiting beyond password verify | π΄ Not Started | β |
| Admin 2FA / IP allow-list | π΅ N/A | OPEN in spec |
8. Notifications (FR15) β
Email + in-product only; no SMS; candidates never get scores.
| Notification type | Status |
|---|---|
| Email verification | π΄ Not Started |
| Password reset | π΄ Not Started |
| Team invitation | π‘ Partially Met |
| Candidate booking / change / cancel | π΄ Not Started |
| Reminder 24h / 1h before start | π΄ Not Started |
| Unbooked invitation 24h before expiry | π΄ Not Started |
| Candidate completion (no scores) | π΄ Not Started |
| Report ready / failed | π΄ Not Started |
| Calendar sync issues | π΅ N/A |
| Admin payment / funding / expiry | π΄ Not Started |
| Admin alerts (<30 min, zero, blocked, expiry) | π΄ Not Started |
| Member funding visibility | π΄ Not Started |
| ICS in email | π΄ Not Started |
| Bounce / retry without duplicates | π΄ Not Started |
| Timezone / deactivated creator fallback | π΄ Not Started |
Queues: Only InterviewCompleted, ReportGenerate β no notification consumer.
9. Retention (FR16) β
| Policy element | Spec | Status | Evidence / gap |
|---|---|---|---|
| Default 60 days evidence | β | π‘ Partially Met | retentionExpiresAt at settlement |
| Admin 30 days option | β | π΄ Not Started | β |
| Anchor expiry terminal / unbooked | β | π‘ Partially Met | β |
| Draft files 30 days | β | π΄ Not Started | β |
| Snapshot + deletion date UI | β | π΄ Not Started | β |
| Cannot shorten promised availability | β | π΄ Not Started | β |
| Purge notices 7d / 1d | β | π΄ Not Started | Field only |
| PDF + evidence export | β | π΄ Not Started | β |
| Export page 1h fresh auth | β | π΄ Not Started | β |
| Scoped URLs β€ 5 min | β | π‘ Partially Met | Files module |
| Export copies purge 24h | β | π΄ Not Started | β |
| Active purge 72h | β | π΄ Not Started | β |
| Backups +30d tombstone | β | π΄ Not Started | β |
| Legal hold | β | π΄ Not Started | β |
| Financial records 7 years | β | π΄ Not Started | β |
| Operational logs 30 days | β | π‘ Partially Met | CloudWatch default |
| Audit 1 year | β | π΄ Not Started | β |
| Primary region us-east-1 | β | π‘ Partially Met | ACM/ALB |
| No indefinite customer storage | β | π’ Met (policy) | β |
10. Operations (FR17) β
Capacity & signup β
| Requirement | Status |
|---|---|
| 10 concurrent / 3 per workspace | π΄ Not Met |
| 100 completed/day qual | π΄ Not Started |
| 100 rows/import | π΅ N/A / π΄ |
| Public signup within capacity | π΄ Not Started |
| Overload blocks new not confirmed | π΄ Not Started |
Monitoring β
| Signal | Status |
|---|---|
| Ledger invariants | π΄ Not Started |
| Session/worker/room health | π΄ Not Started |
| Provider errors | π΄ Not Measured |
| Report/recording age | π΄ Not Started |
| Email queues | π΅ N/A |
| Stripe reconciliation | π΄ Not Started |
| SQS consumer health | π‘ Partially Met |
Alerting β
| Requirement | Status |
|---|---|
| CloudWatch critical alarms | π΄ Not Started |
| DLQ depth > 0 | π΄ Not Started |
Log-based request.failed | π΄ Not Started |
| Cost alerts | π΄ Not Started |
| Stalled runtime β€60s | π΄ Not Started |
Operator console & runbooks β
| Requirement | Status |
|---|---|
| Audited operator console | π΄ Not Started |
| Backup restore | π΄ Not Started |
| Rollback / deploy failure | π‘ Partially Met |
| DLQ replay | π‘ Partially Met |
| Credit adjustment without duplicate | π΄ Not Started |
Observability β
| Capability | Status |
|---|---|
| Structured JSON logging (Pino) | π’ Met |
Correlation x-request-id API β SQS | π’ Met |
| PII redaction | π’ Met |
| Per-request access log | π’ Met |
| Error envelope | π’ Met |
GET /health + smoke | π’ Met |
| ALS org/user on all logs | π‘ Partially Met |
| Metrics / APM / tracing | π΄ Not Started |
Proctoring ops (FR19) β
| Requirement | Status |
|---|---|
| Preflight all detector paths before paid start | π΄ Not Started |
| Independent detector heartbeats | π΄ Not Started |
| Missing capture block/pause meter | π‘ Partially Met |
| Evidence incidents; no default 100% integrity | π΄ Not Started |
| Neutral integrity reminders β€2 | π΄ Not Started |