Ops 시나리오 가이드 (Master Admin 수동 검증 페이지)
apps/ops 콘솔의 /scenarios 페이지는 ADR 0028 (비즈니스 로직 추출) 기반의 수동 검증 도구. masterAdmin 이 web 의 비즈니스 로직 (packages/business-logic/*) 을 직접 호출해 데이터 변경 후 결과를 ops 콘솔에서 즉시 확인한다.
1. 정체성 — 무엇이 아니고 무엇인가
아니다:
- E2E 자동화 스위트 아님 (그건
apps/web/e2e/) - 단위 테스트 대체 아님 (그건
apps/web/__tests__/business-logic-*.test.ts) - production 데이터 운영 도구 아님
이다:
- masterAdmin 이 신규 도메인 출시 전 수동 smoke test 하는 카드 묶음
- ADR 0028 추출 효과 가시화 — 같은 비즈니스 함수가 web Server Action 과 ops 시나리오 양쪽에서 호출 가능함을 증명
- 시나리오 결과 (
tenants/{tid}/e2eRuns/{runId}) 는 테스트 tenant 화이트리스트 (isTestTenantId) 에서만 생성 — production tenant 오염 차단
2. 보안·격리 모델
- 접근 제어:
masterAdmins/{email}Firestore 화이트리스트 - mutation 게이트:
getServerOpsSession()+isTestTenantId(tenantId)통과해야만 실행 - cross-tenant 차단: 화이트리스트 외 tenant 에 mutation 시도 → throw. ADR 0028 패턴 강제
- firebase-admin SDK: ops 시나리오 server actions 는
apps/ops/lib/firebase/server.ts의 admin SDK 사용. v9 modular client SDK 와 분리
3. 카드 구조 (20 도메인, 약 91 카드)
apps/ops/app/(ops)/scenarios/_components/cards/<domain>/<Card>.tsx
| 도메인 | 카드 수 | 주제 |
|---|---|---|
auth | 4 | 동의·재동의·마케팅 토글·계정 삭제 |
auto | 1 | 체인 시나리오 (여러 도메인 묶음) |
ai-assist | 2 | 어시스트 reserve / refund |
case-lifecycle | 8 | 사건 생성·상태·관계·삭제·복원·purge·배치 |
case-fields | 11 | 판결·집행·수임료·의뢰인·divorce/property/inheritance/contract 도메인 필드·recoveryType·subrogation |
recovery | 4 | 회수 추가·수정·삭제·분배 |
schedule | 2 | 기일 추가·결과 |
evidence | 2 | 증거 추가·삭제 |
comm | 3 | 메시지 전송·코멘트·읽음 |
portal | 4 | 토큰 발급·revoke·메시지·읽음 |
docs | 13 | finalize·생성·저장·rename·duplicate·삭제·shared·version·rollback·lock·submit |
snippets | 3 | 스니펫 생성·수정·삭제 |
rag | 4 | related-memories 이벤트·precedent citation·chat feedback |
learning | 1 | 다듬기 피드백 |
members | 4 | 초대·수락·역할·삭제 |
metadata | 5 | 한도·공지·점검 모드·플래그 |
infra | 5 | 인프라 킬 스위치·헬스 |
invoice | 3 | 인보이스 생성·확정·삭제 |
snapshots | 4 | 채권 스냅샷 생성·롤백 |
tenant-lifecycle | 4 | 테넌트 생성·삭제·정지·복구 |
총 ≈ 91 카드 + composition page.tsx (Tier 묶음 grid).
4. 사용 흐름
일상 검증
- 신규 도메인 PR 머지 직후 → ops
/scenarios페이지 접속 → 해당 도메인 카드 클릭 - 테스트 tenant 선택 (드롭다운, 화이트리스트 only)
- Run → server action 실행 → 결과 패널 (
ResultPanel) 에 성공/실패 + Firestore write 요약 - Firestore 직접 확인 → ops 콘솔의 tenants 페이지에서 변경 내역 확인
회귀 검증 (체인 시나리오)
auto/ChainScenarioCard — 사건 생성 → 기일 추가 → 회수 등록 → 종결 일련 흐름을 한 번에 실행. ADR 0028 추출이 cross-domain 호환되는지 검증.
5. 신규 카드 추가
ADR 0028 패턴 강제:
- 비즈니스 로직은
packages/business-logic/<도메인>/에 두기 (web Server Action 도 같은 함수 호출) - ops 시나리오 server action (
apps/ops/app/(ops)/scenarios/_actions/run-<scenario>-scenario.ts) 은 thin wrapper:getServerOpsSession()검증isTestTenantId(tenantId)gatectx빌드 (tenantId · actorUid · firebase-admin db)- 비즈니스 함수 호출
- 결과 +
e2eRuns문서 작성
- 카드 컴포넌트 (
_components/cards/<domain>/<Card>.tsx) — 입력 폼 + Run 버튼 + ResultPanel 연결 page.tsx의 import + Section grid 에 추가
6. 운영 모드 vs 시나리오 모드
| 항목 | tenants 페이지 (운영) | scenarios 페이지 (검증) |
|---|---|---|
| 데이터 표시 | client SDK + Firestore rules | 결과 패널 + Firestore write 후 재조회 |
| Mutation | 금지 (read-only) | 허용 (테스트 tenant 한정) |
| 접근 | masterAdmin | masterAdmin |
| 격리 | 전 tenant 조회 가능 | 테스트 tenant 화이트리스트만 |
관련 문서
- Ops 시나리오 카드 레퍼런스 — 카드별 입출력 명세
- ADR 0028 비즈니스 로직 추출
- Firebase 헬스체크 (ADR 0029) — 시나리오 페이지 KPI=0 시 헬스체크 절차