본문으로 건너뛰기

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

도메인카드 수주제
auth4동의·재동의·마케팅 토글·계정 삭제
auto1체인 시나리오 (여러 도메인 묶음)
ai-assist2어시스트 reserve / refund
case-lifecycle8사건 생성·상태·관계·삭제·복원·purge·배치
case-fields11판결·집행·수임료·의뢰인·divorce/property/inheritance/contract 도메인 필드·recoveryType·subrogation
recovery4회수 추가·수정·삭제·분배
schedule2기일 추가·결과
evidence2증거 추가·삭제
comm3메시지 전송·코멘트·읽음
portal4토큰 발급·revoke·메시지·읽음
docs13finalize·생성·저장·rename·duplicate·삭제·shared·version·rollback·lock·submit
snippets3스니펫 생성·수정·삭제
rag4related-memories 이벤트·precedent citation·chat feedback
learning1다듬기 피드백
members4초대·수락·역할·삭제
metadata5한도·공지·점검 모드·플래그
infra5인프라 킬 스위치·헬스
invoice3인보이스 생성·확정·삭제
snapshots4채권 스냅샷 생성·롤백
tenant-lifecycle4테넌트 생성·삭제·정지·복구

총 ≈ 91 카드 + composition page.tsx (Tier 묶음 grid).

4. 사용 흐름

일상 검증

  1. 신규 도메인 PR 머지 직후 → ops /scenarios 페이지 접속 → 해당 도메인 카드 클릭
  2. 테스트 tenant 선택 (드롭다운, 화이트리스트 only)
  3. Run → server action 실행 → 결과 패널 (ResultPanel) 에 성공/실패 + Firestore write 요약
  4. Firestore 직접 확인 → ops 콘솔의 tenants 페이지에서 변경 내역 확인

회귀 검증 (체인 시나리오)

auto/ChainScenarioCard — 사건 생성 → 기일 추가 → 회수 등록 → 종결 일련 흐름을 한 번에 실행. ADR 0028 추출이 cross-domain 호환되는지 검증.

5. 신규 카드 추가

ADR 0028 패턴 강제:

  1. 비즈니스 로직은 packages/business-logic/<도메인>/ 에 두기 (web Server Action 도 같은 함수 호출)
  2. ops 시나리오 server action (apps/ops/app/(ops)/scenarios/_actions/run-<scenario>-scenario.ts) 은 thin wrapper:
    • getServerOpsSession() 검증
    • isTestTenantId(tenantId) gate
    • ctx 빌드 (tenantId · actorUid · firebase-admin db)
    • 비즈니스 함수 호출
    • 결과 + e2eRuns 문서 작성
  3. 카드 컴포넌트 (_components/cards/<domain>/<Card>.tsx) — 입력 폼 + Run 버튼 + ResultPanel 연결
  4. page.tsx 의 import + Section grid 에 추가

6. 운영 모드 vs 시나리오 모드

항목tenants 페이지 (운영)scenarios 페이지 (검증)
데이터 표시client SDK + Firestore rules결과 패널 + Firestore write 후 재조회
Mutation금지 (read-only)허용 (테스트 tenant 한정)
접근masterAdminmasterAdmin
격리전 tenant 조회 가능테스트 tenant 화이트리스트만

관련 문서