Product Requirements Document

Investor Dashboard PRD — root64

§1

Overview

기관 투자자가 root64의 카이아 펀드 단일 풀에 투자한 자금이 어떻게 움직이고 있는지를 보고자(에잇퍼센트)에게 의존하지 않고 직접 확인할 수 있는 웹 포털을 정의한다. 모든 자금 흐름은 SPC 사무수탁사의 EIP-712 서명을 거쳐 Ethereum에 기록되며, 투자자는 대시보드에서 본 데이터(NAV·잔액·자산·거래)와 Etherscan의 1차 증거를 한 번의 클릭으로 교차 검증할 수 있다.

§2

Source Documents

  • docs/product/2026-04-15-user-personas-and-flows.md §3.1.1 (기관 투자자 페르소나), §5.2 (대시보드 플로우)
  • docs/foundation/2026-04-13-product-strategy.md §2.3 (NAV 운영), §2.5 (FX 정책), §4.1·§5 (Stage 1 정의 — 본 PRD는 §4.1을 채택. §5.3과의 모순은 Q9로 위임. 💡 [AI-Assumption])
  • docs/foundation/2026-04-20-business-structure.md (SPC·신탁 구조, 토큰 발행 주체)
  • docs/technical/2026-04-13-technical-architecture.md (on-chain/off-chain 경계, 인덱서)
  • docs/technical/contracts/2026-04-14-smart-contract-design.md (Etherscan 이벤트 모델)
  • docs/technical/database/2026-04-15-database-design.md (NAV per unit 이력, FX 저장)
  • docs/technical/database/2026-04-14-cash-flow-ledger.md (CashFlowLedger 이벤트 스키마)
  • docs/technical/database/2026-04-14-pool-registry.md (PoolRegistry 집계)
  • docs/partnership/kaia/2026-04-29-kaia-master-framework-agreement-v3.2.md (단일 풀 운영 조건)
  • docs/partnership/kaia/2026-04-07-kaia-term-sheet-v1.3.md (수익 구조·NAV 산정 주기)
  • docs/legal/2026-04-17-legal-overview.md (KYC/AML, statement 의무)
  • docs/legal/2026-04-21-hong-kong-unit-trust-regulation.md (HK 펀드 규제)
  • Prototype: wireframes/root64-dashboard.html (디자인 핸드오프, Sign in / Portfolio / Assets / Transactions 5-screen)
소스와 본 PRD가 충돌하는 항목은 §10에 기재한다.
§3

Applied Planning Principles

  • Source-of-truth: NAV·잔액·자산·거래 데이터는 PoolRegistry / CashFlowLedger 컨트랙트와 그 인덱서가 권위. 대시보드는 그 위의 표현 계층이며 PII 마스킹·통화 환산만 한다.
  • Persona consistency: docs/product/2026-04-15-user-personas-and-flows.md §3.1.1의 기관 투자자(대표 인스턴스 Kaia Foundation) 단일 페르소나. 새 페르소나 도입 없음.
  • MVP scope: Stage 1 한정 — 카이아 펀드 단일 풀, 단일 originator(에잇퍼센트), 단일 투자자 인스턴스. 다중 풀·다중 투자자·Merkle 증명·환매 요청 UI는 Stage 2로 명시적 연기(§8).
  • PII handling: 차주(borrower) 이름·연락처 등 개인정보는 자산 detail에서 *** (masked)로 노출 차단. 로그·트레이스에도 평문 미저장(NFR-7). 은행 reference 등 메타데이터는 해시 형태로만 표시.
§4

Personas

PersonaGoalsPain PointsPermissionsEntry / Exit
기관 투자자
Kaia Foundation, offshore 헤지펀드, 패밀리오피스
  • 한국 대체자산 수익률 확보
  • 독립 검증 가능한 투명성으로 실사 비용 절감
  • 주간/월간 보고 대체 — 언제든 dashboard에서 NAV·자산·거래 확인
  • 한국 대출자산·법체계에 익숙하지 않음
  • 보고자(에잇퍼센트)에 의존하지 않고 자산 상태를 검증할 수단 부재
  • 외환신고·송금 등 규제 대응 부담
  • 본인 계정으로 본인 보유분만 read
  • 풀 집계 통계 read
  • 본인 거래·자산 CSV 다운로드
  • 쓰기 권한 없음 (환매·납입 요청은 본 PRD 범위 밖)
Entry: 에잇퍼센트가 KYC/AML 완료 후 계정 생성·초기 비밀번호 발급
Exit: Sign out, 또는 세션 만료
Stage 1은 단일 페르소나이므로 §5 FR에서 Actor 필드를 생략한다 (§5 머리말 공통 명시).
§5

Functional Requirements

모든 FR의 Actor: 기관 투자자 (Stage 1 단일 페르소나). 시스템 동작·체인 이벤트 기록 주체는 root64 운영팀 / SPC 사무수탁사이며, 대시보드 FR은 투자자 관점에서의 관찰 가능 결과로 기술한다.
화면 필터
Sign in (인증)
FR-1이메일 + 비밀번호 로그인
Statement 시스템은 이메일과 비밀번호로 본인을 인증하고 세션을 발급한다. 비공개 포털이므로 회원가입 UI는 제공하지 않으며, 접근 요청은 hello@root64.io 이메일로만 받는다.
Acceptance Criteria
  • 이메일·비밀번호 유효 + KYC 완료 계정 → 세션 발급 + Portfolio 화면으로 이동
  • 이메일·비밀번호 불일치 → 폼 상단에 "Invalid email or password" 표시, 세션 미발급
  • 로그인 처리 중 → Sign in 버튼 라벨 "Signing in…" + 버튼 disabled
  • "Don't have access yet?" 안내 → mailto:hello@root64.io?subject=Request%20access 링크만 노출, 자기 가입 폼 없음
  • "Forgot your password?" 클릭 → mailto:hello@root64.io?subject=Password%20reset%20request 메일 클라이언트 오픈
FR-2초기 비밀번호 변경 강제 (첫 로그인)
Statement 시스템은 root64가 발급한 초기 비밀번호로 첫 로그인한 사용자에게 즉시 새 비밀번호를 설정하도록 강제한다. 비밀번호를 설정해야 본 세션이 활성화된다.
Acceptance Criteria
  • 초기 비밀번호 검증 통과 + password_set=false → "Set your password" 화면으로 라우팅
  • 새 비밀번호 길이 < 12자 → "Password must be at least 12 characters." 표시
  • 새 비밀번호에 대문자·소문자·숫자 중 하나라도 없음 → "Use upper-case, lower-case, and a number." 표시
  • 비밀번호 확인 불일치 → "Doesn't match" 인라인 표시, Save 버튼 활성화 유지하되 제출 시 차단
  • 비밀번호 강도(1~5) → 입력 길이·복잡도에 따라 5단 막대로 시각화
  • 저장 성공 → password_set=true 마킹 + Portfolio 화면으로 이동
FR-3데모 우회로 ("Skip for now") — 비프로덕션 한정
Statement 시스템은 빌드 플래그 DEMO_MODE=true일 때만 첫 로그인 패스워드 설정 단계를 건너뛸 수 있는 "Skip for now (demo)" 링크를 노출한다. 프로덕션 빌드에서는 해당 링크가 렌더되지 않는다.
Acceptance Criteria
  • 빌드 플래그 DEMO_MODE=true → "Skip for now (demo) →" 링크 렌더, 클릭 시 패스워드 변경 없이 인증 완료 처리
  • 빌드 플래그 DEMO_MODE=false(=프로덕션) → 해당 링크 DOM 미존재, 우회 불가
  • 플래그 값은 빌드 타임에 결정되며 런타임 토글 불가
FR-4Sign out
Statement 시스템은 어느 화면에서든 topbar의 "Sign out" 클릭으로 즉시 세션을 종료하고 Sign in 화면으로 되돌린다.
Acceptance Criteria
  • 인증된 상태에서 "Sign out" 클릭 → 세션 토큰 무효화 + Sign in 화면으로 이동
  • Sign out 후 브라우저 back → Sign in 화면 유지 (보호 라우트 재진입 불가)
Portfolio (포트폴리오 요약)
FR-5KPI 카드 — Your position · Cumulative return · NAV per unit
Statement 시스템은 Portfolio 화면 진입 시 본인 보유분의 핵심 지표 3종을 KPI 카드로 표시한다: ① Your position(NAV total, USD), ② Cumulative return(USD + %), ③ NAV per unit(USD, 전일 대비 변화율 포함).
Acceptance Criteria
  • 로딩 중 → 각 카드에 스켈레톤 표시, 값 영역 비움
  • 정상 로드 → KPI value + sub label("10,000,000 units × NAV $1.025 / unit" 형식) + 출처 배지(FR-22)
  • NAV per unit 카드 → 가장 최근 NAV cut의 PoolRegistry write tx 해시 1-click Etherscan 링크 함께 표시
  • Cumulative return → 양수는 녹색 +$…, 음수는 적색 -$…, 기준 시점 "since <pool inception>" 명시
  • 오류 → 카드에 "Unable to load" + 재시도 링크 (페이지 새로고침)
FR-6KPI — Delinquency · Awaiting NAV cut
Statement 시스템은 풀의 연체 비율과 다음 NAV cut을 기다리는 금액을 별도 카드로 표시한다. Awaiting NAV cut 카드는 "단위(units) 추정치를 표시하지 않는다"는 정책을 명시한다.
Acceptance Criteria
  • Delinquency 카드 → 연체율(%) + 연체 채권 수 + 미상환 잔액(KRW). 0%일 때 녹색, > 0%일 때 적색
  • Awaiting NAV cut 카드 → 최근 입금된 cash 금액 + "deposit · units confirm at <cut datetime> KST" 라벨 + Σ pending 배지
  • "View transaction →" 클릭 → 해당 TX detail drawer 오픈(FR-15)
  • NAV cut 대기 중 → "Estimated units are intentionally not displayed." 캡션 노출 (사용자에게 차익거래 방지 의도 전달)
  • 대기 건 없음 → 카드는 표시되나 금액 0 + "No pending deposits" 캡션
FR-7NAV per unit 차트 (since inception)
Statement 시스템은 풀 설정일(inception)부터 오늘까지의 NAV per unit 추이를 라인 차트로 표시한다. X축은 시간, Y축은 NAV per unit(USD).
Acceptance Criteria
  • 정상 → SVG 라인 차트 + X축 tick 라벨 + "SINCE POOL INCEPTION · <inception> → <today>" 캡션
  • 차트 영역 hover → 십자선(crosshair) + 해당 일자의 NAV 툴팁
  • NAV cut 미발생일 (inception 직후) → "Awaiting first NAV cut" 비어 있는 차트 영역 + 안내 문구
  • 차트 헤더 → 현재 NAV($1.025 등) + 누적 변화율(+2.50%) + Total units + Pool inception 일자 동시 표시
  • NAV 산출 주기 (일별 / 주간)는 Q3에 종속 — 차트 점 간격에 영향
FR-8Pool composition (스냅샷)
Statement 시스템은 현재 풀에 담긴 자산의 유형별 비중을 도넛 차트와 범례로 표시한다. 데이터는 off-chain 스냅샷이며, 스냅샷 일자를 카드 헤더에 표기한다.
Acceptance Criteria
  • 정상 → 도넛 + 범례(자산 유형명 + %) + 카드 헤더에 "snapshot · MM-DD" 라벨
  • 자산 유형 데이터 없음 → "No composition data yet" empty state
  • 오프체인 출처 배지(○ off-chain) 카드 우상단 표시 (FR-22)
FR-9Recent transactions 위젯
Statement 시스템은 Portfolio 화면 하단에 본인 풀의 최근 거래 4건을 일자·유형·금액·상태·증거 컬럼의 테이블로 미리보기 형태로 표시한다.
Acceptance Criteria
  • 정상 → 최신순 4행 표시, 각 행 클릭 시 TX detail drawer 오픈(FR-15)
  • 거래 0건 → "No transactions yet" empty state + Transactions 탭 링크
  • "View all →" 버튼 → Transactions 탭으로 이동 (필터 초기화)
  • 각 행의 금액 → KRW 원본 + USD 환산 동시 표시
  • Status 컬럼 → settled는 "Settled" pill, pending은 ◐ Awaiting NAV cut 배지
  • Proof 컬럼 → TX hash 단축 표시 + 1-click Etherscan 링크 (FR-23)
Assets (기초자산 목록 + Detail drawer)
FR-10자산 목록 — 검색 · 필터 · 정렬 · 페이지네이션
Statement 시스템은 풀에 담긴 active receivables(기초자산)을 페이지당 10건 단위로 표 형태로 표시하며, ID/이름/유형/담보 텍스트 검색, 상태 필터(All/Normal/Delinquent), 컬럼별 정렬을 지원한다.
Acceptance Criteria
  • 정상 → Loan / Principal / Interest paid / Rate / Maturity / LTV / Status 컬럼 표시, page-size = 10
  • 검색어 입력 → ID·loan name·type·collateral 대소문자 무시 부분 일치, 결과 카운트 "(filtered)" 표기
  • 검색어 입력 후 ESC 키 또는 ESC 버튼 클릭 → 검색어 클리어
  • 필터 chip 선택 → 즉시 필터 적용 + 페이지 1로 리셋
  • 컬럼 헤더 클릭 → 정렬 토글(↑↓), 활성 컬럼에 ind 표기, 다른 컬럼 클릭 시 기본 방향 적용(금액·rate·LTV는 desc 시작, name·날짜는 asc 시작)
  • 검색·필터·정렬 변경 → 페이지 1로 자동 리셋
  • 페이지네이션 → "Showing X–Y of Z" + 1~7페이지 버튼 + 7페이지 초과 시 "…" 표기
  • 결과 0건 → "No receivables match this search." empty state
  • 각 행 클릭 → Asset detail drawer 오픈(FR-11)
  • 화면 헤더에 active receivables 수·총 원금(₩…B)·총 이자 수령액(₩…M) 요약 표시
FR-11Asset detail drawer
Statement 시스템은 자산 행 클릭 시 우측 drawer로 해당 receivable의 상세 정보를 표시한다: Loan terms, Collateral, Repayment history. 차주 개인정보는 마스킹한다.
Acceptance Criteria
  • 행 클릭 → drawer slide-in + backdrop 활성, 본문 스크롤 잠금
  • Loan terms 섹션 → Origination, Maturity, Original principal, Outstanding, Accrued interest, Interest rate(p.a. + "monthly amortizing" 보조 텍스트)
  • Collateral 섹션 → Type, LTV, Appraised value, Borrower(마스킹: *** (masked) + "PII redacted" 캡션)
  • Repayment history → 일자·라벨·금액(KRW) 행 리스트, 최신순
  • drawer 하단 disclosure → "MVP에서 individual receivable data integrity는 외부 감사가 검증, 풀 집계만 PoolRegistry 기록" 안내
  • drawer 상단 출처 배지 → ○ off-chain + "Stage 2 will publish a Merkle proof tying this receivable to the pool's assetSetHash."
  • ESC 키 또는 backdrop 클릭 또는 ✕ 버튼 → drawer 닫힘
FR-12Assets CSV 내보내기
Statement 시스템은 현재 검색·필터·정렬이 적용된 자산 행을 CSV 파일로 다운로드 제공한다. 파일명은 root64_assets_<pool_id>_<YYYY-MM-DD>.csv.
Acceptance Criteria
  • "Download CSV · N rows" 버튼 클릭 → 즉시 CSV 다운로드, 행 수는 현재 필터 결과와 일치
  • CSV 헤더 → ID, Loan name, Type, Status, Principal (KRW), Outstanding (KRW), Accrued interest (KRW), Interest paid cum. (KRW), Rate (% p.a.), LTV (%), Appraised value (KRW), Origination, Maturity, Collateral
  • 한글 헤더·UTF-8 BOM 등 인코딩 정책 → Q5에 종속
  • 필터 결과 0건 → 버튼 disabled + 라벨 "0 rows"
Transactions (거래내역, statement view)
FR-13Period stats 패널
Statement 시스템은 Transactions 화면 상단에 현재 필터가 적용된 기간의 합계 통계를 표시한다: Period 라벨, Inflows, Outflows, Net, Events count(+ settled/awaiting NAV 분해).
Acceptance Criteria
  • 필터 변경 → stats 즉시 재계산(클라이언트 로컬)
  • Period 라벨 → "Last 30 days" / "Last 3 months" / "Last 6 months" / "All time" 중 현재 range에 해당
  • type / sign 필터가 "all" 아니면 "· type · <type>", "· direction · inflows|outflows" 추가 표기
  • Net → 양수는 녹색, 음수는 적색
  • Events → 전체 count + "X settled · Y awaiting NAV" 보조 텍스트
  • 필터 결과 0건 → 모든 셀에 ₩0 / 0 events 표시 (오류 아님)
FR-14월별 statement-style 그룹화 + 검색 · 기간 · 방향 · 유형 필터
Statement 시스템은 거래 이벤트를 yyyy-mm 단위로 그룹화하여 월별 헤더(월 이름 + Inflows / Outflows / Net / Events)와 접을 수 있는 리스트로 표시한다. 검색·기간·방향·유형 4종 필터를 지원한다.
Acceptance Criteria
  • 기본 진입 → 가장 최근 월 한 개만 펼친 상태, 나머지는 접힘
  • 월 헤더 클릭 → 해당 월 토글 (펼침/접힘)
  • 월이 2개 이상 → "Expand all months" / "Collapse all months" 일괄 토글 버튼 노출
  • 검색 → hash · flowId · counterparty · type 부분 일치 검색
  • 기간 필터 → Last 30d / Last 3 mo / Last 6 mo / All time 중 단일 선택
  • 방향 필터 → All / Inflows + / Outflows − 중 단일 선택
  • 유형 필터 → Any type / Interest / Principal / Early / Reinvest / Withdraw 중 단일 선택
  • 필터 결과 0건 → "No transactions match this filter." empty state
  • 각 row → 일자 / 유형(+ counterparty) / 금액(KRW + USD) / 상태(Settled pill 또는 ◐ Awaiting NAV 배지) / proof(TX hash 단축 + Etherscan 링크) / chev
  • 각 row 클릭 → TX detail drawer 오픈(FR-15)
FR-15Transaction detail drawer
Statement 시스템은 거래 row 클릭 시 우측 drawer로 해당 이벤트의 상세를 표시한다: Event 메타, Settlement(pending 시), 독립 검증 액션(Etherscan / hash copy).
Acceptance Criteria
  • drawer 헤더 → 거래 유형, 금액(KRW signed + USD 환산), 상태 배지(⛓ on-chain 또는 ◐ Awaiting NAV)
  • Event 섹션 → flowId, Type(TX code), Amount(KRW + USD @ FX 표기), Counterparty(+ hash 단축), Bank reference(해시 표기), Trustee signature("EIP-712 · verified"), Recorded at(UTC), Block #, Transaction hash
  • Pending 상태 → "Settlement" 섹션 추가, "Unit issuance is performed at the next NAV batch on <date>" + "Estimated units intentionally hidden." 캡션
  • "Open on Etherscan ↗" → 새 탭에서 etherscan.io/tx/<hash> 오픈
  • "Copy TX hash" → navigator.clipboard에 hash 복사, 시각 피드백
  • ESC 키 또는 backdrop 클릭 또는 ✕ 버튼 → drawer 닫힘
FR-16Transactions CSV 내보내기
Statement 시스템은 현재 검색·기간·방향·유형 필터가 적용된 거래 이벤트를 CSV로 다운로드 제공한다. 파일명은 root64_transactions_<pool_id>_<YYYY-MM-DD>.csv.
Acceptance Criteria
  • "Download CSV · N events" 버튼 클릭 → 즉시 CSV 다운로드
  • CSV 헤더 → TX hash, flowId, Date, Recorded at (UTC), Type, TX code, Amount (KRW), Amount (USD est), Status, Counterparty, Trustee signature
  • USD est = round(amountKrw / FX_KRW_USD), FX는 다운로드 시점의 BoK ECOS 환율
  • 한글 헤더·UTF-8 BOM 인코딩 정책 → Q5에 종속
  • 필터 결과 0건 → 버튼 disabled + 라벨 "0 events"
공통 chrome (topbar · view bar · pool · FX · 출처 배지)
FR-17Topbar — Pool switcher (Stage 1 단일 풀)
Statement 시스템은 topbar 좌측에 root64 워드마크와 함께 Pool switcher를 렌더한다. Stage 1에서는 보유 풀이 카이아 펀드 하나이므로 dropdown 항목이 1개이고 실제 전환은 일어나지 않는다.
Acceptance Criteria
  • 버튼 라벨 → "Pool · <pool name> ▾"
  • 클릭 → dropdown 표시, 항목 1개 (현재 풀, 체크 표시)
  • Stage 2 진입(다중 풀) 시 UX는 본 PRD 범위 밖, dropdown 인터랙션 셸만 유지
FR-18Viewbar 탭 — Portfolio / Assets / Transactions
Statement 시스템은 인증 후 모든 화면에서 topbar 하단에 3개 탭(Portfolio / Assets / Transactions)을 표시하고, 우측에 풀 메타("Last NAV · <date>", "Block · #<num>", "live · Ethereum" 배지)를 노출한다.
Acceptance Criteria
  • 활성 탭 → 강조 스타일 (밑줄/색상)
  • 탭 클릭 → 메인 영역의 화면 즉시 교체, drawer는 닫힘
  • 풀 메타 우측 영역 → 최근 NAV cut 일자 + 해당 블록 번호 + "live · Ethereum" on-chain 배지
FR-19FX strip — BoK ECOS 환율 표시
Statement 시스템은 KRW↔USD 환산이 일어나는 화면(Portfolio · Assets · Transactions 헤더)에 FX strip 위젯으로 KRW/USD 환율 1개를 표시한다. 출처는 Bank of Korea ECOS이며 갱신 일자를 표기한다.
Acceptance Criteria
  • 정상 → "1 USD = ₩X,XXX.X · BoK ECOS · <date>" 형식
  • 환율 로드 실패 → "FX rate unavailable" 표시, 모든 USD 환산 셀에 "— USD" 노출 (KRW 원본은 계속 표시)
  • FX 갱신 주기 → Q4에 종속
Assumption 투자 PRD에서는 KRW를 원본으로 두고 USD는 보조로 표시한다 — 프로토타입의 모든 셀이 "KRW + USD est" 이중 표기 패턴을 따른다. 💡 [AI-Assumption]
FR-20사용자 chip (계정 표시)
Statement 시스템은 topbar 우측에 사용자 chip을 렌더한다: avatar(2자 이니셜) + 계정 식별자 + caret. Stage 1에서 dropdown 자체는 비활성 placeholder.
Acceptance Criteria
  • 정상 → "KA · kaia.fund ▾" 형식, ARIA-labelled
  • 클릭 → Stage 1에서는 어떤 메뉴도 열리지 않음 (account settings는 본 PRD 범위 밖)
FR-21투자자별 데이터 격리
Statement 시스템은 모든 화면에서 본인 계정에 매핑된 풀·보유분·거래만 조회하도록 응답을 필터링한다. 다른 투자자의 데이터는 어떤 화면에서도 노출되지 않는다.
Acceptance Criteria
  • 본인 풀의 자산·거래만 응답
  • 풀 집계(NAV, composition, delinquency)는 본인이 투자한 풀에 한정
  • API 응답에 다른 투자자의 식별자·금액 등 포함되지 않음 (백엔드 필터링 후 전달)
Assumption Stage 1은 단일 투자자 인스턴스(Kaia Foundation)이므로 격리 정책의 운영 부담은 낮지만, Stage 2 다중 투자자 대비 본 FR은 처음부터 구조화한다. 💡 [AI-Assumption]
출처 추적 (Source badges + Etherscan)
FR-223-state 출처 배지 + Σ COMPUTED 마커
Statement 시스템은 모든 데이터 카드·테이블 셀에 데이터 출처를 4종 배지로 명시한다: ⛓ on-chain (블록체인 기록), ○ off-chain (DB 스냅샷), ◐ Awaiting NAV cut (체인 기록되었으나 NAV 배치 대기), Σ COMPUTED (앞의 1·2차 소스에서 클라이언트가 계산).
Acceptance Criteria
  • NAV per unit · 단위 수 · 거래 이벤트 → ⛓ on-chain 배지
  • 차주 정보 · 자산 detail · 풀 composition · 연체율 → ○ off-chain 배지
  • 입금 received but NAV 미반영 → ◐ Awaiting NAV cut 배지 + units 추정치 비노출
  • Your position(units × NAV), Cumulative return, USD 환산값 → Σ COMPUTED 배지 + 기반 소스 명시
  • 배지 hover → 1-line tooltip ("Recorded on Ethereum at block #…" 또는 "Off-chain snapshot · <date>" 등)
  • 같은 데이터 소스를 쓰는 화면 간 배지 종류가 일관됨 (예: 어디서나 NAV는 ⛓)
FR-23TX hash 1-click Etherscan 링크
Statement 시스템은 모든 거래 표시에서 TX hash를 단축 표기(0xabcd…1234 형식)와 함께 외부 링크로 노출한다. 클릭 시 새 탭에서 https://etherscan.io/tx/<hash>를 연다.
Acceptance Criteria
  • Recent transactions · Transactions row · TX drawer 모두에서 동일 표기 적용
  • 링크는 target="_blank" rel="noreferrer"
  • hash 클릭 시 페이지 내 라우팅 발생하지 않음
  • TX drawer 내부 → 명시적 "Open on Etherscan ↗" 버튼 + "Copy TX hash" 보조 버튼 별도 제공
§6

Non-functional Requirements

IDCategoryStatementTarget
NFR-1Responsive대시보드는 desktop 우선 설계이나 tablet·mobile 폭에서도 핵심 정보를 읽고 조작 가능해야 한다.브레이크포인트: ≤768 (mobile), 769–1199 (tablet), ≥1200 (desktop). 모든 표는 mobile에서 가로 스크롤 허용. KPI 그리드는 mobile에서 1열, tablet에서 2열, desktop에서 3열. 터치 타겟 ≥ 44×44px.
NFR-2Performance주요 화면의 first interactive 시간과 필터 조작 응답성을 정량 보증.Portfolio 첫 화면 LCP ≤ 2.5s (p75, 데스크탑 25Mbps 기준). Assets·Transactions 필터·정렬·페이지 전환 응답 ≤ 100ms (p95, 1000행 mock 기준).
NFR-3Number/Date Formatting금액·통화·날짜 표기를 모든 화면에서 일관되게 한다.KRW: ₩1,234,567 또는 축약 ₩1.23B(≥1억원). USD: $1,234,567 또는 축약 $1.2M(≥백만달러). 퍼센트: 소수점 둘째자리. 날짜: YYYY-MM-DD 절대표기, NAV cut 시각은 KST 명시. 음수는 부호 prefix(-₩…) + 색상(적색).
NFR-4AccessibilityWCAG 2.1 AA + 키보드·모션·헤딩 계층 추가 요구.대비비 ≥ 4.5:1 (본문), ≥ 3:1 (큰 텍스트·UI 요소). prefers-reduced-motion: reduce 시 drawer·chart 애니메이션 0ms로 감소. 키보드 Tab 순서 = 시각 순서. h1→h2→h3 계층 비건너뜀. focus-visible 모든 인터랙티브 요소에 명시. 모든 차트·배지에 ARIA-label.
NFR-5Browser Support기관 사용자의 표준 브라우저 환경 보장.최신 2개 메이저 버전: Chrome, Safari, Edge, Firefox. IE 미지원. mobile Safari iOS 15+, Chrome Android 최신 2버전.
NFR-6Security · Session인증·세션 보안 기본선.세션 토큰은 HttpOnly · Secure · SameSite=Lax 쿠키. 비활성 30분 후 자동 로그아웃. 비밀번호 해시는 Argon2id (또는 bcrypt cost ≥ 12). 비밀번호 평문 미저장. Brute force 차단: 동일 계정 5회 실패 후 15분 잠금.
NFR-7PII & Logging차주 개인정보·은행 reference 원문은 어떤 로그·트레이스에도 평문으로 남기지 않는다.로그 라인에 borrower name·전화·계좌번호 매칭 정규식 redaction. Sentry/observability 페이로드 sampling에서 PII 필드 화이트리스트만 수집. 은행 reference는 SHA-256 해시 후 prefix만 UI에 노출. 보존 기간: 운영 로그 90일, 거래 이력 영구.
NFR-8External Dependency Resilience외부 의존성(Etherscan, BoK ECOS) 장애 시에도 핵심 화면이 작동.BoK ECOS 환율 fetch 실패 → 24시간 이내 last-known 값 fallback + "stale" 표시. Etherscan 도달 불가 → TX hash 표시는 유지하되 외부 링크 클릭 시 사용자에게 안내. 풀 인덱서 lag > 5분 → viewbar에 "stale" 표시.
NFR-9Discoverability (SEO/social)비공개 포털 — 검색엔진 노출·공유 카드 미지원.모든 라우트에 <meta name="robots" content="noindex,nofollow">. Open Graph·Twitter card 메타 미설정. canonical URL 미설정. favicon만 root64 브랜드 제공.

UI 완결성 커버리지 (D1–D7)

권위 기준은 .claude/PRD-UI-CHECKLIST.md. UI 표면이 있는 PRD이므로 7개 차원 모두 귀결.

차원귀결비고
D1 반응형NFR-1브레이크포인트·터치 타겟·표 가로 스크롤·KPI 그리드 변화 명시
D2 상태 모델FR-5, FR-7, FR-8, FR-9, FR-10, FR-14, NFR-8loading·empty·error·stale 각 FR Acceptance에 명시. 같은 소스(인덱서) 화면 간 stale 표시 대칭.
D3 인터랙션 메커니즘FR-10, FR-11, FR-14, FR-15, FR-23정렬 토글, ESC drawer 닫기, expand/collapse all months, Etherscan 새 탭, hash 복사
D4 포맷·콘텐츠NFR-3, Q5금액·통화·날짜 포맷은 NFR-3에 정량 명시. CSV 인코딩 표준은 Q5로 위임.
D5 모션·접근성NFR-4prefers-reduced-motion, focus-visible, ARIA-label, 헤딩 계층 명시
D6 페이지 레벨NFR-5, NFR-9, §8브라우저 매트릭스·noindex 메타·SEO/공유 미지원은 §8 명시적 제외
D7 데이터 형상FR-10, FR-14, §10페이지당 10건, mock 데이터 형상 가정은 §10 기록
횡단 차원은 가능하면 NFR로 귀결시키고 FR 신설은 최소화했다. 귀결 칸의 FR/NFR/Q는 모두 <a class="xref"> 링크.
§7

User Flows & Screens

Flow A최초 사용자 첫 로그인 — 초기 비밀번호 변경

Persona
기관 투자자 (Kaia Foundation 등)
Entry
이메일로 받은 초기 비밀번호 + 대시보드 URL
  1. [Actor] Sign in 페이지에서 이메일·초기 비밀번호 입력 → [System] 인증 + password_set=false 감지 → Set password 화면으로 라우팅 (FR-1, FR-2)
  2. [Actor] 새 비밀번호 입력(12자, 대·소·숫자) + 확인 → [System] 강도 시각화, 검증 통과 시 Save 활성
  3. [Actor] Save → [System] 비밀번호 저장, password_set=true, 인증 완료, Portfolio 화면 진입
Exit
Portfolio 화면 (기본 탭)
Screens
Sign in (FR-1) → Set password (FR-2) → Portfolio (FR-5–9)
Error
비밀번호 정책 미충족 → 폼 인라인 오류, 다음 단계 차단. 저장 API 실패 → "Save failed" 토스트 + 재시도 가능.

Flow B재로그인 (정상 케이스)

Persona
기관 투자자
Entry
대시보드 URL 직접 접근, 세션 없음
  1. [Actor] 이메일·자가 설정 비밀번호 입력 → [System] 인증 성공 → Portfolio 진입 (FR-1)
Exit
Portfolio 화면
Screens
Sign in → Portfolio
Error
5회 실패 → 15분 잠금(NFR-6). 30분 비활성 → 자동 로그아웃 후 Sign in 복귀.

Flow C포트폴리오 → 자산 상세 조회

Persona
기관 투자자
Entry
Portfolio 화면, 어떤 receivable의 상세를 확인하고 싶음
  1. [Actor] 상단 탭에서 Assets 선택 → [System] 자산 목록 렌더 (페이지당 10) (FR-10)
  2. [Actor] 검색·필터·정렬로 대상 채권 좁힘 → [System] 즉시 결과 갱신, 페이지 1로 리셋
  3. [Actor] 채권 행 클릭 → [System] Asset detail drawer slide-in, Loan terms / Collateral / Repayment history 노출 (FR-11)
  4. [Actor] ESC → [System] drawer 닫힘, 목록 상태 유지
Exit
Assets 목록 (필터·정렬·페이지 유지)
Screens
Assets (FR-10) → Asset detail drawer (FR-11)
Error
검색 결과 0건 → empty state. 자산 상세 API 실패 → drawer 본문에 "Unable to load detail" + 재시도 링크.

Flow D거래내역 조회 + Etherscan 교차 검증

Persona
기관 투자자
Entry
월간 보고 대체 또는 특정 입금 건 확인 의도
  1. [Actor] Transactions 탭 → [System] Period stats + 최근 1개월 펼친 상태 렌더 (FR-13, FR-14)
  2. [Actor] 기간·방향·유형 필터 조작 → [System] stats + 월별 그룹 즉시 재계산
  3. [Actor] 특정 row 클릭 → [System] TX detail drawer 오픈 (flowId·서명·블록·hash 표시) (FR-15)
  4. [Actor] "Open on Etherscan ↗" 클릭 → [System] 새 탭에서 etherscan.io 오픈, 사용자가 1차 증거 확인 (FR-23)
Exit
Transactions 화면 (필터 유지) 또는 Etherscan 외부 탭
Screens
Transactions (FR-13, 14) → TX drawer (FR-15) → Etherscan
Error
필터 결과 0건 → empty state. Pending 거래 → "Awaiting NAV cut" 명시, 단위 추정 비노출.

Flow ECSV 다운로드 (Assets / Transactions)

Persona
기관 투자자 (회계·감사용 데이터 export 의도)
Entry
Assets 또는 Transactions 화면, 원하는 필터 적용된 상태
  1. [Actor] 화면 헤더의 "Download CSV · N rows/events" 클릭 → [System] 현재 필터 결과를 즉시 CSV로 생성·다운로드 (FR-12, FR-16)
  2. [Actor] Excel/Numbers에서 열어 검토 → 헤더·값 매핑 확인
Exit
원래 화면 유지
Screens
Assets (FR-12) 또는 Transactions (FR-16)
Error
필터 결과 0건 → 버튼 disabled로 사전 차단. 다운로드 실패(브라우저 정책) → 토스트 안내.

Flow FSign out

Persona
기관 투자자
Entry
인증된 임의의 화면
  1. [Actor] topbar "Sign out" 클릭 → [System] 세션 무효화 + Sign in 화면 라우팅 (FR-4)
Exit
Sign in 화면
Screens
(any) → Sign in
Error
없음 (실패해도 로컬 토큰은 폐기, 다음 보호 라우트 접근 시 재인증 요구)
§8

What We're NOT Doing

  • 다중 풀 · 다중 투자자 UX — Stage 1은 카이아 펀드 단일 풀, 단일 투자자 인스턴스 한정. Pool switcher 셸만 유지하고 실제 전환 인터랙션은 미구현.
  • Merkle 증명 · 개별 receivable의 on-chain 검증 — Stage 2에서 assetSetHash 도입 예정 (docs/foundation/2026-04-13-product-strategy.md §4.2 / docs/technical/contracts/...). MVP는 풀 집계만 PoolRegistry 기록.
  • 환매 요청 · 추가 납입 UX — Term Sheet상 환매는 6개월 후·$10,000 단위 (personas-and-flows.md §5.1 8단계)이며, Stage 1에서는 이메일 기반 수동 처리. 대시보드에 요청 폼·승인 워크플로우 없음.
  • 회원가입 · 셀프 KYC UX — KYC/AML은 root64 운영팀의 외부 절차로 처리, 계정은 운영팀이 생성. 사용자 가입 폼·KYC 업로드 UI 없음.
  • OTP · SSO · 지갑 로그인 — Stage 1은 이메일+비밀번호. OTP/SSO/지갑 인증은 Stage 2 이후(personas-and-flows.md §7 열린 질문, 본 PRD Q1).
  • 알림 (이메일/인앱/Slack) — 연체·NAV cut 알림 채널은 Stage 1 범위 밖, Q8.
  • 퍼블릭 통계 페이지 — 비로그인 사용자 대상 풀 집계 뷰는 product-strategy.md §3.5에 정의되나, 본 PRD는 프라이빗 대시보드(인증 후)만 다룬다.
  • 관리자 · 운영팀 · originator 콘솔 — Stage 1 시점에서는 별도 PRD/도구로 분리. 본 대시보드는 투자자 read-only 뷰 한정.
  • SEO · 소셜 공유 — 비공개 포털이므로 noindex (NFR-9). Open Graph 카드 미설정.
  • 이차 거래 · 자체 DEX — Non-goals (product-strategy.md §8).
§9

Open Questions

Q1OTP / SSO / 지갑 인증의 도입 시점과 마이그레이션Security · Product
personas-and-flows.md §5.2·§7은 Stage 1에서 이메일+OTP를 시사하나, 프로토타입은 이메일+비밀번호로만 구현됨. 추가로 SSO·지갑 인증의 도입 시점·기존 사용자 마이그레이션 방법 미정.
  • A.Stage 1 = 이메일+비밀번호로 fix, Stage 2 진입 시 OTP/SSO 도입 (현재 프로토타입과 정합)
  • B.Stage 1 진입 직전 OTP 추가 (이메일 OTP, no app), 비밀번호는 1차 인증
👉 추천: A — 프로토타입·운영 부담·MVP 일정과 일치. Stage 2에서 SSO/지갑까지 일괄 검토.
종속: FR-1
Q2비밀번호 복구 — 수동 이메일 vs 자동화 (magic link)Security · Ops
현재 프로토타입은 "Forgot your password?" 클릭 시 hello@root64.io 메일 클라이언트 오픈 — 운영팀 수동 처리. 자동 복구 링크는 미구현.
  • A.Stage 1 = 수동(이메일) 유지 — 기관 투자자 모수가 작아 운영 부담 낮음
  • B.매직 링크(시간 제한 token) 자동화로 즉시 전환
  • C.이메일 OTP 기반 reset
👉 추천: A — 모수가 적고 보안 사고 시 운영팀이 직접 검증할 수 있어 위험 적음. Stage 2에서 B로 전환.
종속: FR-1
Q3NAV per unit 산출 주기 — 일별 vs 주간Backend · 필수
product-strategy.md §2.3은 "주간 NAV 산출, 월간 리포트"라고 명시. 프로토타입은 "since inception" 차트에 일별 점 패턴을 가정. 운영 정책 확정 필요 — 인덱서·차트 점 간격·"Last NAV" 표기에 직접 영향.
  • A.일별 NAV — 차트 해상도 ↑, 차익 거래 방지 정책(units 추정 미노출) 그대로 유지
  • B.주간 NAV — strategy 문서 정합, 차트 점 간격 ≥ 7일
👉 추천: B로 Stage 1 출시 → 운영 자동화 안정화 후 A로 전환. 차트 UI는 두 주기 모두 호환.
종속: FR-5, FR-7, FR-18
Q4FX 갱신 주기 — BoK ECOS 폴링 빈도와 캐시 정책Backend
BoK ECOS는 KRW/USD 환율을 일 1회 고시. 대시보드는 KRW 원본 + USD 환산 이중 표기. 폴링 빈도·캐시 만료·"stale" 표기 임계 필요.
  • A.일 1회 폴링 (KST 12:00 직후), 24h 캐시. 폴링 실패 시 last-known 사용, "stale" 표기
  • B.매 요청마다 서버 측 캐시 확인 → max-age 1시간
👉 추천: A — 원천이 일 1회이므로 폴링 빈도 1회로 단순화.
종속: FR-19, NFR-8
Q5CSV 인코딩·헤더 언어 표준화Product · Ops
프로토타입은 영문 헤더, UTF-8(BOM 없음)로 생성. 회계·감사 사용자가 Excel(KO)에서 한글 깨짐을 피하려면 UTF-8 BOM 또는 EUC-KR 검토 필요.
  • A.UTF-8 + BOM, 영문 헤더 유지 (Excel·Numbers·LibreOffice 호환)
  • B.UTF-8 + BOM, 영문/한글 헤더 병기 (예: "TX hash / 거래 해시")
  • C.현행 유지(UTF-8 no BOM, 영문)
👉 추천: A — Excel KO 호환 + 운영 단순. 한글 헤더는 Stage 2 다국어 검토 시 도입.
종속: FR-12, FR-16
Q6Cumulative return 계산식 — 단순 NAV 변화 vs IRR · TWRFinance · Backend
프로토타입의 "Cumulative return"은 단순 NAV 변화 기준으로 보임 (예: $0.025/unit × 보유 units). 추가 납입·환매가 있는 경우의 정확한 수익률(IRR · TWR) 미정.
  • A.Stage 1 = 단순 NAV 변화 (units × (NAV_now − NAV_at_purchase)) — 단일 lump-sum 가정에서 정확
  • B.TWR — 추가 납입·환매 빈도와 무관하게 운용 성과 표현
  • C.Money-weighted IRR — 실제 투자자 현금흐름 기준
👉 추천: A — Stage 1 모수(단일 lump-sum, 6개월 락업)에서는 충분. Stage 2 다중 납입·환매 도입 시 B 또는 C 재검토.
종속: FR-5
Q7Delinquency 비율 산출 기준 — 풀 전체 vs 투자자 보유분Product
프로토타입의 Delinquency KPI(1.2%, ₩180M outstanding)가 풀 전체 기준인지 본인 보유분 기준인지 불명. Stage 1은 단일 투자자라 결과적으로 동일하지만 정의가 필요.
  • A.풀 전체 outstanding 대비 연체 outstanding 비율 (NAV에 반영되는 단위와 일치)
  • B.본인 보유분에 비례한 연체 노출 — 다중 투자자 환경 대비
👉 추천: A — Stage 1에서는 차이 없고, NAV가 같은 기준으로 계산되므로 정합성 높음.
종속: FR-6
Q8알림 채널 — 이메일 / 인앱 / SlackProduct · Ops
personas-and-flows.md §5.2 6단계가 "연체·부실·검증 실패 이벤트 알림"을 언급하나 채널·트리거 미정. 본 PRD는 인앱·이메일 알림 모두 미포함.
  • A.Stage 1 = 알림 없음, 사용자가 로그인해 확인 (현 PRD 입장)
  • B.월간 NAV 리포트만 이메일 푸시 — 운영팀이 발송
👉 추천: A — MVP 부담 최소. Stage 2에서 이벤트 기반 자동 알림 도입.
Q9strategy 문서 §4.1 ↔ §5.3 MVP 경계 모순 — 보정 필요Foundation · 필수
product-strategy.md §4.1은 "투자자 로그인 + 대시보드"를 1단계 핵심 산출물로 분류하나, §5.3은 "내 투자 내역·자산 현황·수익 추적"을 MVP 이후로 분류한다. 본 PRD는 §4.1을 채택해 프로토타입 전체를 Stage 1로 정의했다. strategy 문서의 §5.3을 정합되게 보정해야 한다.
  • A.strategy §5.3에서 "내 투자 내역·자산 현황·수익 추적" 항목을 삭제하고 §4.1 일치하도록 보정
  • B.본 PRD의 일부 FR(Assets detail drawer, NAV chart, Composition)을 Stage 1b로 분리해 §5.3과 정합
👉 추천: A — 프로토타입이 이미 만들어졌고 §4.1·§5.5의 "1단계 핵심 산출물"·"완료 기준"이 §5.3보다 권위. Foundation owner가 §5.3 정리.
종속: §10, 본 PRD 전체 Stage 1 정의
Q10데모 우회로 "Skip for now" — 프로덕션 빌드 처리Security · Ops
프로토타입에는 첫 로그인 시 패스워드 설정을 건너뛰는 "Skip for now (demo) →" 링크가 있다. 본 PRD FR-3DEMO_MODE 빌드 플래그로 분기하나, 운영 환경 정의·검증 절차 명문화 필요.
  • A.DEMO_MODE는 dev/preview 빌드 한정, prod 빌드에서는 컴파일 타임에 dead-code elimination + CI lint로 보장
  • B.아예 프로덕션 코드베이스에서 해당 분기 자체를 제거 (별 git branch에서만 사용)
👉 추천: A — 디자인 데모·QA에는 필요. CI에서 prod build에 "Skip" 문자열 부재 검증 추가.
종속: FR-3
§10

Spec-external Decisions

  • Stage 1 MVP 정의를 strategy §4.1 채택product-strategy.md §4.1과 §5.3 모순(Q9) 상황에서 본 PRD는 §4.1("투자자 로그인 + 대시보드 = 1단계 핵심 산출물")을 채택. 근거: ① §5.5의 완료 기준이 "투자 잔액 + 거래내역 + 확인 가능 상태"로 §4.1과 정합, ② 프로토타입이 이미 §5.3 항목까지 구현된 상태, ③ Stage 2까지 분리 시 일정 지연. Foundation owner의 §5.3 정리가 필요(Q9에 위임).
  • 인증 디테일을 프로토타입 구현으로 채택 — 12자/대·소·숫자 정책, 첫 로그인 시 변경 강제, 비밀번호 복구는 이메일 수동 처리. personas 문서에 미정의된 영역을 프로토타입 디테일로 메움. OTP·SSO·자동 복구는 Stage 2(Q1, Q2).
  • NFR 정량 target의 일부 값 가정 — LCP ≤ 2.5s, 필터 응답 ≤ 100ms, 비활성 30분 로그아웃, 5회/15분 잠금. 운영 SLA·보안 정책 문서 없음 상태에서 업계 표준값 채택.
  • Mock 데이터 가정 — Assets 페이지당 10건, 1000행 미만 환경에서 클라이언트 정렬·필터링이 NFR-2 target을 충족한다고 가정. 실제 카이아 펀드 풀의 receivable 수는 운영 시점 검증 필요.
  • noindex · 비공개 포털 처리docs/legal/2026-04-21-hong-kong-unit-trust-regulation.md의 명시적 공시 제한 조항 없음 상태에서, 비적격 투자자 접근을 차단하기 위해 robots noindex (NFR-9) 채택.
§11

Dependencies & Integration Points

  • Auth/Permissions: 단일 role = investor (read-only). 계정·KYC 상태·비밀번호 해시 저장. 세션 토큰은 HttpOnly 쿠키. role 분기 없음(Stage 1).
  • API Surface:
    • POST /auth/sign-in · POST /auth/set-password · POST /auth/sign-out
    • GET /portfolio/summary (KPI 5종 + NAV chart points)
    • GET /pool/composition
    • GET /assets?search&filter&sort&page + GET /assets/{id}
    • GET /transactions?range&type&sign&search + GET /transactions/{id}
    • GET /fx/krw-usd (BoK ECOS proxy, 캐시)
    • GET /assets/export.csv + GET /transactions/export.csv
  • DB/Data: 인덱서가 PoolRegistry · CashFlowLedger 이벤트를 PostgreSQL에 적재. 본 PRD가 의존하는 테이블:
    • pool_registry_snapshots (totalUnits, NAV per unit, NAV cut block & tx hash) — docs/technical/database/2026-04-14-pool-registry.md
    • cash_flow_events (flowId, type, amount KRW, counterparty, trustee_sig, tx_hash, recorded_at, status) — docs/technical/database/2026-04-14-cash-flow-ledger.md
    • receivables (id, name, type, status, principal, outstanding, accrued, rate, ltv, appraised, maturity, collateral, masked borrower)
    • fx_rates_krw_usd (rate, fetched_at, source)
    • investors (id, email, password_hash, password_set, kyc_status, pool_ids[])
  • External:
    • Etherscan — 1-click 외부 링크. SLA 없음, 도달 불가 시 NFR-8 fallback.
    • Bank of Korea ECOS — 일 1회 환율 fetch. Q4 폴링 정책.
    • Ethereum 인덱서 — PoolRegistry · CashFlowLedger 이벤트 → DB 적재. lag > 5분 시 viewbar "stale" 표기 (NFR-8).
    • 이메일 라우팅hello@root64.io는 root64 운영팀 inbox. 접근 요청·비밀번호 복구의 수동 처리 채널.
§12

References

  • Prototype: wireframes/root64-dashboard.html — Sign in / Portfolio / Assets / Transactions 5-screen, Claude Design 핸드오프
  • Preview deployment: rwa-docs.developer-b64.workers.dev/root64-dashboard.html
  • Brand·design system: docs/design/2026-05-18-design-system.md (Walnut "root" · Teal "64" · Hanken Grotesk + Pretendard + JetBrains Mono)
  • Glossary: docs/glossary/8percent.md (root64 정의), docs/glossary/blockchain.md (on-chain/off-chain 용어)
  • Foundation: docs/foundation/2026-04-09-mission-vision-core-values.md (Underwriting First 가치)

Self-Eval Scores

.claude/evals/rubrics/prd-quality.md 기준 자체 평가.

CriterionWeightScore
명료성heavy4.5 / 5
측정가능성heavy4.5 / 5
페르소나 일관성light5 / 5
스코프 명확성light4.5 / 5
구조·추적성light5 / 5
UI 구현 완결성light4.5 / 5
Weighted Average = 4.625 / 5.0 — PASS

평가 근거: 23개 FR이 모두 actor(공통)·statement·acceptance bullets로 구조화. NFR 9건 모두 정량 target. D1–D7 커버리지 표 7행 모두 실재 ID 인용. 4개 AI-Assumption 명시. §9 Open Q 10건, 모두 옵션·추천·종속 구비. 0.5점 감점 사유: NAV 산출 주기(Q3)·CSV 인코딩(Q5)이 운영 결정 대기 중이라 일부 FR의 acceptance가 후속 결정에 종속.