WI-...-028~033 에 대응하는 FE-OC-027~032 owner 노트.
- 각 노트의 제외 범위에 'use case·domain model·business rule' 을 명시해
이 skeleton 이 port 와 adapter 계약까지임을 못박았다
- 근거 절에 '근거 등급 경계' 문단을 넣어 project-local default 와
외부 근거를 구분했다 (수집은 FE-Q-011~014 가 소유)
- 구현 가이드 절은 비워 두고 사유를 남겼다 — 근거 raw 없이 채우면
모든 cell 이 UNSUPPORTED_IMPL_DECISION 이 된다
- multi-protocol 노트는 '신규 port 0개' 를 제외 범위에 명시했다.
port 가 늘어나면 그 자체가 회귀 신호다
9개 registry는 single primary owner와 compatibility impact를 MUST 기록
FE-REG-STORAGE 확장의 compatibility impact 기록
수신한 위임
Delegation Ref
From
Concern
Status
DELEG-FE-008
feature-frontend-large-object-transfer-contract
전송 대상 File/Blob handle 과 object URL 수명 소유
accepted
가져온 흐름 단계
Stage Ref
Order
Owner
Input
Action
Output
목표
FileDialogPort 와 BlobStorePort 를 정의하고, IndexedDB·OPFS·Cache Storage adapter 와 object URL 수명 계약을 고정한다. 이 계약이 없으면 컴포넌트가 URL.createObjectURL 을 직접 부르고 revokeObjectURL 을 빠뜨려 탭 수명 동안 메모리가 증가하며, quota 초과 시 correctness 값이 조용히 memory 로 fallback 된다.
이슈:
PR:
범위
포함 범위
FileDialogPort — 파일 선택(<input type=file> / File System Access) 과 저장 dialog
port ownership, storage registry, capability registry
근거 등급 경계: FE-D027(backend 선택 순서)의 Evidence / rationale 은 project-local default, 외부 source claim 아님 이다. MDN File System Access·OPFS·Cache Storage 등 외부 근거 raw 는 아직 수집되지 않았으며 그 수집 계획은 FE-Q-011 이 소유한다. 이 branch 의 결정을 외부 표준이 뒷받침한다고 말할 수 없다.
TODO
FileDialogPort 인터페이스 확정 — 등급: planned
BlobStorePort 인터페이스와 backend 선택 규칙 확정 — 등급: planned
object URL 수명 계약과 누수 fixture — 등급: planned
quota 초과 시 evictionOrder 동작과 null 행 보호 fixture — 등급: planned
OPFS 순차 write fixture — 등급: planned
Cache Storage 버전 파티션 fixture — 등급: planned
FE-GATE-027 binary I-O report 산출 — 등급: planned
진행 중 메모
FE-REG-STORAGE 의 UPLOAD_PART_STATE 는 quotaFallback: 없음, evictionOrder: null 이다. 이 두 값은 §9.4 의 "correctness 에 영향을 주는 값은 storage fallback 을 임의 적용하지 않는다" 를 행 단위로 구현한 것이므로, adapter 가 이 행에 대해 memory fallback 을 하면 gate negative fixture 가 잡아야 한다.
결정 사항
2026-07-28: object URL 생성·해제를 adapter 가 쌍으로 소유 / 이유: 해제 누락이 컴포넌트 단위로 흩어지면 검출이 불가능 / 검토한 대안: 컴포넌트 훅에서 useEffect cleanup 으로 관리 / 근거: 근거 raw 미수집, project-local 판단 (FE-Q-011)
결정-근거 매핑
Decision ID
Decision
선택 조건 (언제 이 결정 / 언제 대안)
Supporting Claims
Evidence Strength
Open Risk
D1
object URL 생성·해제를 adapters/file 이 쌍으로 소유
항상. 컴포넌트가 URL 문자열을 직접 다뤄야 하는 요구가 생기면 재검토
없음 — FE-Q-011 수집 대상
project-local default
해제 시점을 adapter 가 알 수 없는 사용 패턴(장기 미리보기)이 있을 수 있음
D2
BlobStorePort 가 backend 를 노출하지 않음
항상. OPFS 전용 최적화가 use case 레벨에서 필요해지면 재검토
없음 — FE-Q-011 수집 대상
project-local default
backend 별 성능 특성이 크게 다르면 추상화가 새는 지점이 생김
구현 가이드
근거 raw 자료(FE-Q-011) 수집 전까지 비워 둔다. 지금 채우면 모든 cell 이 UNSUPPORTED_IMPL_DECISION 이 되어, 다음 작업자가 근거 있는 결정 과 임의 trade-off 를 구분할 수 없다.
엣지·실패·의존
실패·엣지 경로
사용자가 dialog 를 닫음 → FILE_PICKER_DISMISSED, error surface 없음, telemetry event 없음
accept/size 제약 위반 → FILE_REJECTED, 위반 제약만 안내하고 파일명은 telemetry 에 남기지 않음
private mode 등으로 storage 접근 불가 → BLOB_STORE_UNAVAILABLE, registry quotaFallback 적용, 없음 행은 terminal
quota 초과 → BLOB_STORE_QUOTA_EXCEEDED, evictionOrder 순 제거 후 재시도. evictionOrder: null 행은 제거 대상이 아니다