harden /admin/meetings security+perf, add Yen risk-class taxonomy
- B.1 CRITICAL: lock down /api/guest/translate
- require inviteToken + validate against MeetingInvite (expiry + status)
- per-token + per-IP rate limits
- CORS lock to katura1999.com / *.vercel.app / dev localhost
- use real invite.meetingId for cache bucketing (kill 'guest_shared' hack)
- B.3: escape HTML in invite email body (guestName/hostName/title/email)
- B.4: realtime-session route now binds to [id] meeting, validates active, attaches metadata (meetingId/adminEmail), audit-logs to MeetingTranslationSession
- B.5: cap MeetingInvite joins at 5; force-expire all invites on End meeting
- B.7: random per-session LiveKit identity (randomBytes 8) β no inviteId leak
- B.8: hashed guest chat identity via XOR-fold (no token prefix exposure)
- B.9: tight Permissions-Policy on /g/:token* in next.config.ts (camera/mic/display-capture self only; X-Frame DENY; noindex)
- B.10: rate-limit invite GET endpoint per-IP
- B.11: Brevo emails tagged [meeting:id, invite:id] for searchable audit
- A.2: SR interimResults=true + interim caption render (instant feedback)
- A.7: skip MeetingTranslationCache write for utterances <= 120 chars
- New: prisma/migrations/add-meeting-translation-session.sql
- New: src/lib/security/escape-html.ts (shared escaper)
- src/lib/rate-limit.ts: 5 new RATE_LIMITS entries for meetings
- src/lib/yen/risk-classes.ts: 6-class taxonomy (READ_ONLY / REVERSIBLE_INTERNAL_WRITE / EXTERNAL_NOISY / FINANCIAL / IDENTITY / DESTRUCTIVE) + CLASS_POLICY + TOOL_RISK_CLASS for every shipped + Tier-1 tool + SUBAGENT_DEFAULT_BUDGET (canCreateSubAgents:false hardcoded)
- src/lib/yen/sensitivity.ts: tag() / redactForModel() / redactForAdmin() for field-level visibility labels (public/internal_only/never_model)
- src/lib/yen/outbound-scrubber.ts: pre-approval pattern scanner (SSN, Luhn-valid cards, API keys, internal markers, cost-basis terms, supplier refs, HR notes) β scrubOutboundMessage + scrubArtifact
- src/lib/yen/guardrails.ts: evaluateGuard now falls through to CLASS_POLICY default (BLOCK/GATE/ALLOW) after explicit SOFT_GATED check
- YEN-CLAUDE-CAPABILITIES.md (9-section capabilities + roadmap doc)
- MEETINGS-TRANSLATION-AUDIT.md (perf A.1-A.11 + security B.1-B.12)
- YEN-VIRGIL-REVIEW-RESPONSE.md (point-by-point response with code evidence)
333b07eView on GitHub β