docs(hub): DELEG-FE-007~011 위임과 FLOW-FE-EVENT-001~005 흐름 추가

인바운드 이벤트는 FLOW-FE-RESP-* 에 자리가 없어 별도 5단계로 고정한다.
스트림에는 요청이 없고 응답에는 재개 커서가 없으므로 순서를 합치지 않는다.
검증 통과분만 application 에 도달하며 구독 해제는 port 계약이 소유한다.
This commit is contained in:
DongHyeonka
2026-07-28 14:12:59 +09:00
parent 88a99cdb24
commit a8804cd9f2
@@ -313,6 +313,7 @@ Out of scope:
> §7.3 응답 처리 순서 8단계에 **단계별 owner** 를 붙인 것이다. 순서 자체는 §7.3 이 계속 소유하고, 이 표는 *각 단계를 누가 소유하며 그 단계가 지켜야 할 불변식이 무엇인가* 를 고정한다.
> 이 표가 없을 때 stage 4~6 의 throw/non-throw 경계와 stage 7 산출물(model vs view-model)이 branch 마다 다르게 적혀 있었다. 단계 계약을 바꾸려면 owner 가 revision 을 올리고, 인접 단계 branch 는 pin 이 낡아 `STALE_IMPORTED_CONTRACT` 로 잡힌다.
> `FLOW-FE-RESP-*` 는 요청/응답 한 번의 여정이고 `FLOW-FE-EVENT-*` 는 인바운드 프레임 하나의 여정이다. 두 흐름은 3~4단계에서 같은 runtime schema owner 를 공유하지만 순서를 합치지 않는다 — 스트림에는 요청이 없고 응답에는 재개 커서가 없다. 구독 해제(cleanup)는 어느 흐름도 소유하지 않고 `RealtimeSubscriptionPort` 계약이 소유한다.
| Stage ID | Order | Owner | Input | Action | Output | Invariants | Revision |
|---|---:|---|---|---|---|---|---|
@@ -324,6 +325,11 @@ Out of scope:
| `FLOW-FE-RESP-006` | 6 | `feature-runtime-schema-validation-contract` | 분기 확정 envelope | payload per-operation 스키마 검증 | 검증된 payload(deep clone) | payload invalid 는 `SCHEMA_MISMATCH`; mapper 는 검증 통과분만 받는다 | 1 |
| `FLOW-FE-RESP-007` | 7 | `feature-boundary-mapper-viewmodel-contract` | 검증된 payload | DTO → application model 매핑 | application model | 이 단계 산출물은 model 이고 view-model 이 아니다 — view-model 투영은 `application/view-models/` 소유(§4.2·§4.4 2-stage) | 1 |
| `FLOW-FE-RESP-008` | 8 | `feature-frontend-error-classification-boundary-contract` | application model 또는 실패 신호 | 정규화된 결과 반환 | application result 또는 normalized failure | 총함수 — 미매핑 예외는 `UNKNOWN_FAILURE` 로 귀결하고 throw 를 presentation 으로 통과시키지 않는다 | 1 |
| `FLOW-FE-EVENT-001` | 1 | `feature-frontend-realtime-subscription-lifecycle-contract` | 열린 연결 | 프레임 수신 대기 | raw frame | 연결 오류는 이 단계가 소유하고 이후 단계로 예외를 넘기지 않는다 | 1 |
| `FLOW-FE-EVENT-002` | 2 | `feature-frontend-realtime-subscription-lifecycle-contract` | raw frame | transport decode (SSE 필드 / WebSocket frame / poll 응답 본문) | unvalidated event JSON | decode 실패는 프레임을 버리고 실패로 전환하며 연결을 즉시 끊지 않는다 | 1 |
| `FLOW-FE-EVENT-003` | 3 | `feature-runtime-schema-validation-contract` | unvalidated event JSON | event envelope 공유 스키마 검증 | discriminated event envelope | 경계 검증은 non-throwing 이며 throw 를 상위로 누출하지 않는다 | 1 |
| `FLOW-FE-EVENT-004` | 4 | `feature-runtime-schema-validation-contract` | discriminated event envelope | `eventSchema` per-event 검증 | 검증된 event payload | 미검증 프레임은 `EVENT_SCHEMA_MISMATCH` 로 드롭하고 application 에 도달시키지 않는다 | 1 |
| `FLOW-FE-EVENT-005` | 5 | `feature-frontend-error-classification-boundary-contract` | 검증된 event payload 또는 실패 신호 | 정규화된 이벤트 또는 failure 반환 | application event 또는 normalized failure | 총함수 — 미매핑 예외는 `UNKNOWN_FAILURE` 로 귀결한다 | 1 |
<!-- section-id: delegation-registry -->
### 2.1.2 Delegation Registry (typed)
@@ -331,7 +337,9 @@ Out of scope:
> 한 branch 가 다른 branch 에 관심사를 넘길 때 여기에 행을 만든다. `Status` 가 `accepted` 가 되려면
> **delegate 쪽 문서가 frontmatter `accepts_delegations` 로 접수해야** 한다. 접수 전에는 `proposed` 이고
> `UNACCEPTED_DELEGATION` 으로 계속 잡힌다 — "A 가 넘겼는데 B 는 받은 적 없는" 공백이 조용히 남지 않게 하는 장치다.
> 아래 6행은 2026-07-20 문서 간 정합성 감사에서 **미접수 위임으로 발견됐고, 이후 delegate 6곳이 모두 `accepts_delegations` 로 접수해 현재는 전부 `accepted`** 다(2026-07-21 frontmatter 왕복 대조 6/6 일치, `UNACCEPTED_DELEGATION` 0건). 즉 이 표는 지금 열려 있는 공백 목록이 아니라 닫힌 위임의 등록부다.
> `DELEG-FE-001`~`DELEG-FE-006` 은 2026-07-20 문서 간 정합성 감사에서 **미접수 위임으로 발견됐고, 이후 delegate 6곳이 모두 `accepts_delegations` 로 접수해 현재는 전부 `accepted`** 다(2026-07-21 frontmatter 왕복 대조 6/6 일치, `UNACCEPTED_DELEGATION` 0건).
> `DELEG-FE-007`~`DELEG-FE-011` 은 2026-07-28 runtime capability 확장에서 추가했다. 신규 6개 능력 도메인이 서로 또는 기존 branch 에 넘기는 관심사이며, delegate 5곳의 `accepts_delegations` 를 같은 변경에서 채워 접수까지 마쳤다.
> 즉 이 표는 지금 열려 있는 공백 목록이 아니라 닫힌 위임의 등록부다.
| Delegation ID | Concern Key | Revision | Delegator | Delegate | Scope | Status |
|---|---|---|---|---|---|---|
@@ -341,6 +349,11 @@ Out of scope:
| `DELEG-FE-004` | `fe.deleg.color-contrast` | 1 | `feature-accessibility-baseline-contract` | `feature-tailwind-design-token-styling-contract` | color contrast token 값 결정 | accepted |
| `DELEG-FE-005` | `fe.deleg.injectable-random` | 1 | `feature-api-client-response-envelope-contract` | `feature-frontend-clean-architecture-layering-contract` | full-jitter backoff 를 결정론 테스트 가능하게 하는 random source 주입 형태 | accepted |
| `DELEG-FE-006` | `fe.deleg.reload-once-action` | 1 | `feature-async-ui-state-contract` | `feature-frontend-render-recovery-boundary-contract` | `reload-once` action 의 실제 실행(5-condition guard 경유) | accepted |
| `DELEG-FE-007` | `fe.deleg.sw-host-for-push` | 1 | `feature-frontend-realtime-subscription-lifecycle-contract` | `feature-frontend-background-execution-worker-contract` | WebPush 가 요구하는 service worker 등록·수명주기 호스팅 | accepted |
| `DELEG-FE-008` | `fe.deleg.binary-handle-ownership` | 1 | `feature-frontend-large-object-transfer-contract` | `feature-frontend-binary-file-io-store-contract` | 전송 대상 `File`/`Blob` handle 과 object URL 수명 소유 | accepted |
| `DELEG-FE-009` | `fe.deleg.persistent-cache-key` | 1 | `feature-frontend-cache-tier-cross-tab-invalidation-contract` | `feature-frontend-storage-registry-contract` | 영속 캐시의 physical key·namespace·classification·quota fallback 소유 | accepted |
| `DELEG-FE-010` | `fe.deleg.decoded-payload-validation` | 1 | `feature-frontend-multi-protocol-api-transport-contract` | `feature-runtime-schema-validation-contract` | codec 디코드 이후 payload 의 runtime schema 검증 | accepted |
| `DELEG-FE-011` | `fe.deleg.sw-release-coherence` | 1 | `feature-frontend-background-execution-worker-contract` | `feature-frontend-release-cache-rollback-contract` | service worker 버전과 release·rollback coherence 판정 | accepted |
### 2.2 Universal acceptance questions