docs(spec): 실행 결과 반영 — 정정 3건과 검증 기록

- §12.1 #42: §21 표와 frontmatter imports 에 FE-OC-027~032 포함.
  둘 다 branch-owned 계약을 hub 가 pin 하는 자리다
- §12.3: registry 개수 서술이 Summary 밖에도 14곳 있었음
- §13: contract_packet_sha256 생성기 부재 — 신규 노트는 필드 미포함,
  기존 7개는 해시가 낡음
- §15 실행 기록 신설
This commit is contained in:
DongHyeonka
2026-07-28 14:43:00 +09:00
parent d6dfda64ab
commit d19670975b
@@ -474,22 +474,26 @@ hub 는 §3.2(`FE-D*`, legacy)와 §6.1(`DEC-…`, 현행 SSOT)을 쌍으로 유
Summary 셀은 소비 branch 의 상속 표와 **문자열이 정확히 일치**해야 한다(hub §6.1 하단 규칙). 아래 문자열이 SSOT 다. Summary 셀은 소비 branch 의 상속 표와 **문자열이 정확히 일치**해야 한다(hub §6.1 하단 규칙). 아래 문자열이 SSOT 다.
**조사(particle) 앞 공백 없음.** 기존 §6.1 행이 `…release token을 8개 registry로 관리한다` 형태이므로 신규 행도 같은 표기를 쓴다. 이 표를 branch-note 상속 표에 옮길 때 공백을 하나라도 넣으면 문자열 불일치가 된다.
| Decision ID | Revision | Domain | Decision Summary | Status | Evidence | | Decision ID | Revision | Domain | Decision Summary | Status | Evidence |
|---|---:|---|---|---|---| |---|---:|---|---|---|---|
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-CAPABILITY-001` | 1 | `capability` | 신규 runtime capability 6종은 FE-REG-CAPABILITY flag 로 default OFF이며 활성화는 owner·gate·runbook 을 동반한다 | `conditional-default` | §3.2 `FE-D026` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-CAPABILITY-001` | 1 | `capability` | 신규 runtime capability 6종은 FE-REG-CAPABILITY flag로 default OFF이며 활성화는 owner·gate·runbook을 동반한다 | `conditional-default` | §3.2 `FE-D026` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-BINARY-STORE-001` | 1 | `binary-store` | 로컬 바이너리 backend 는 IndexedDB 를 default 로 하고 OPFS 는 대용량 순차 write 에 opt-in, Cache Storage 는 service worker 호스팅 response cache 전용이다 | `conditional-default` | §3.2 `FE-D027` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-BINARY-STORE-001` | 1 | `binary-store` | 로컬 바이너리 backend는 IndexedDB를 default로 하고 OPFS는 대용량 순차 write에 opt-in, Cache Storage는 service worker 호스팅 response cache 전용이다 | `conditional-default` | §3.2 `FE-D027` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-CROSS-TAB-001` | 1 | `cross-tab` | 탭 간 무효화는 BroadcastChannel 우선에 storage event fallback 을 쓰고 leader election 없이 무효화 key 만 전파한다 | `conditional-default` | §3.2 `FE-D028` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-CROSS-TAB-001` | 1 | `cross-tab` | 탭 간 무효화는 BroadcastChannel 우선에 storage event fallback을 쓰고 leader election 없이 무효화 key만 전파한다 | `conditional-default` | §3.2 `FE-D028` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-TRANSFER-CREDENTIAL-001` | 1 | `transfer-credential` | presigned URL 획득은 shared client 를 경유하고 실제 byte 전송은 session credential 을 첨부하지 않는 transfer adapter 가 수행한다 | `accepted-documented-only` | §3.2 `FE-D029` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-TRANSFER-CREDENTIAL-001` | 1 | `transfer-credential` | presigned URL 획득은 shared client를 경유하고 실제 byte 전송은 session credential을 첨부하지 않는 transfer adapter가 수행한다 | `accepted-documented-only` | §3.2 `FE-D029` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-RESUMABLE-TRANSFER-001` | 1 | `resumable-transfer` | 재개 가능 전송은 part size·병렬도·part 재시도 상한을 registry 로 고정하고 part 상태를 BlobStorePort 에 보존한다 | `conditional-default` | §3.2 `FE-D030` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-RESUMABLE-TRANSFER-001` | 1 | `resumable-transfer` | 재개 가능 전송은 part size·병렬도·part 재시도 상한을 registry로 고정하고 part 상태를 BlobStorePort에 보존한다 | `conditional-default` | §3.2 `FE-D030` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-PROTOCOL-001` | 1 | `protocol` | transport default 는 REST 이고 GraphQL·gRPC-Web·Connect-Web 은 FE-REG-API 의 protocol 필드로 opt-in 하며 미지원 환경은 REST gateway 로 fallback 한다 | `conditional-default` | §3.2 `FE-D031` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-PROTOCOL-001` | 1 | `protocol` | transport default는 REST이고 GraphQL·gRPC-Web·Connect-Web은 FE-REG-API의 protocol 필드로 opt-in하며 미지원 환경은 REST gateway로 fallback한다 | `conditional-default` | §3.2 `FE-D031` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-REALTIME-TRANSPORT-001` | 1 | `realtime-transport` | 실시간 transport 는 SSE 를 우선하고 양방향이 필요하면 WebSocket, 둘 다 불가할 때만 최소 간격·backoff·visibility gating 을 갖춘 bounded polling 을 쓴다 | `conditional-default` | §3.2 `FE-D032` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-REALTIME-TRANSPORT-001` | 1 | `realtime-transport` | 실시간 transport는 SSE를 우선하고 양방향이 필요하면 WebSocket, 둘 다 불가할 때만 최소 간격·backoff·visibility gating을 갖춘 bounded polling을 쓴다 | `conditional-default` | §3.2 `FE-D032` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-REALTIME-LIFECYCLE-001` | 1 | `realtime-lifecycle` | 실시간 연결은 full jitter backoff 와 30초 cap 을 쓰고 재시도 상한 후 terminal 상태로 전이하며 resume 은 Last-Event-ID 또는 cursor 로 수행하고 unmount 시 구독을 해제한다 | `conditional-default` | §3.2 `FE-D033` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-REALTIME-LIFECYCLE-001` | 1 | `realtime-lifecycle` | 실시간 연결은 full jitter backoff와 30초 cap을 쓰고 재시도 상한 후 terminal 상태로 전이하며 resume은 Last-Event-ID 또는 cursor로 수행하고 unmount 시 구독을 해제한다 | `conditional-default` | §3.2 `FE-D033` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-SERVICE-WORKER-ROLE-001` | 1 | `service-worker-role` | service worker 는 역할을 분리해 release asset precaching 은 default off 로 유지하고 push·background sync·Cache Storage 호스트 역할만 capability opt-in 으로 허용하며 update UX 계약을 요구한다 | `conditional-default` | §3.2 `FE-D034` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-SERVICE-WORKER-ROLE-001` | 1 | `service-worker-role` | service worker는 역할을 분리해 release asset precaching은 default off로 유지하고 push·background sync·Cache Storage 호스트 역할만 capability opt-in으로 허용하며 update UX 계약을 요구한다 | `conditional-default` | §3.2 `FE-D034` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-BACKGROUND-SYNC-001` | 1 | `background-sync` | background sync 재생은 idempotency keyed operation 만 허용한다 | `accepted-documented-only` | §3.2 `FE-D035` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-BACKGROUND-SYNC-001` | 1 | `background-sync` | background sync 재생은 idempotency keyed operation만 허용한다 | `accepted-documented-only` | §3.2 `FE-D035` |
| `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-WORKER-TASK-001` | 1 | `worker-task` | Web Worker 작업은 structured-clone 또는 Transferable 로만 통신하고 timeout 과 terminate 를 계약하며 worker 안에서 application port 를 재구현하지 않는다 | `accepted-documented-only` | §3.2 `FE-D036` | | `DEC-CA-SKELETON-FRONTEND-OPERATIONAL-CONTRACT-WORKER-TASK-001` | 1 | `worker-task` | Web Worker 작업은 structured-clone 또는 Transferable로만 통신하고 timeout과 terminate를 계약하며 worker 안에서 application port를 재구현하지 않는다 | `accepted-documented-only` | §3.2 `FE-D036` |
Owner 열은 모두 `[[raw/project-notes/ca-skeleton-frontend-operational-contract]]` 다(§6.1 의 기존 모든 행과 동일). Owner 열은 모두 `[[raw/project-notes/ca-skeleton-frontend-operational-contract]]` 다(§6.1 의 기존 모든 행과 동일).
§3.2 의 `Decision` 셀은 문자열 일치 제약을 받지 않으므로 §7.1 의 서술형 문장을 그대로 써도 된다. 제약을 받는 것은 **§6.1 Summary 셀과 branch-note 상속 표** 두 곳뿐이다.
### 7.3 기존 결정 개정 2건 ### 7.3 기존 결정 개정 2건
§3.3 변경 프로토콜을 따르고 §6.1 하단 개정 기록에 남긴다. §3.3 변경 프로토콜을 따르고 §6.1 하단 개정 기록에 남긴다.
@@ -499,9 +503,9 @@ Owner 열은 모두 `[[raw/project-notes/ca-skeleton-frontend-operational-contra
- **분류**: 새 결정(`FE-D034`)이 기존 의미를 대체 → §3.3 5단계 supersede chain - **분류**: 새 결정(`FE-D034`)이 기존 의미를 대체 → §3.3 5단계 supersede chain
- **compatibility_impact**: `behavior-change` — "SW 전면 off" 가 "precaching off + 역할별 opt-in" 으로 바뀐다 - **compatibility_impact**: `behavior-change` — "SW 전면 off" 가 "precaching off + 역할별 opt-in" 으로 바뀐다
- §3.2 `FE-D019``Status``superseded` 로 바꾸고 행은 **삭제하지 않는다** - §3.2 `FE-D019``Status``superseded` 로 바꾸고 행은 **삭제하지 않는다**
- `DEC-…-OFFLINE-CACHE-001` 을 revision 2 로 올리고 Summary 를 다음으로 교체: - `DEC-…-OFFLINE-CACHE-001` 을 revision 2 로 올리고 Summary 를 다음으로 교체 (교체 전 문자열은 `service worker와 offline asset cache는 default off다`):
> `service worker 의 release asset precaching 은 default off 이고 push·background sync·Cache Storage 호스트 역할만 capability opt-in 으로 허용한다` > `service worker의 release asset precaching은 default off이고 push·background sync·Cache Storage 호스트 역할만 capability opt-in으로 허용한다`
- **파급 pin**: `feature-frontend-release-cache-rollback-contract` 의 frontmatter `inherits:` 에서 `DEC-…-OFFLINE-CACHE-001@1``@2`, 그리고 그 branch 의 상속 표 Summary 문자열도 위 문자열로 교체 - **파급 pin**: `feature-frontend-release-cache-rollback-contract` 의 frontmatter `inherits:` 에서 `DEC-…-OFFLINE-CACHE-001@1``@2`, 그리고 그 branch 의 상속 표 Summary 문자열도 위 문자열로 교체
- §8.0 `WI-…-024``Applies Decisions` 에서도 `@1``@2` - §8.0 `WI-…-024``Applies Decisions` 에서도 `@1``@2`
@@ -511,9 +515,9 @@ Owner 열은 모두 `[[raw/project-notes/ca-skeleton-frontend-operational-contra
- **분류**: 9번째 registry 추가 → 기존 8개의 동작은 바뀌지 않음 - **분류**: 9번째 registry 추가 → 기존 8개의 동작은 바뀌지 않음
- **compatibility_impact**: `additive`. §6.1 의 `DEC-…-SUPPLY-CHAIN-001` 선례대로 **revision 을 유지(1)** 한다 - **compatibility_impact**: `additive`. §6.1 의 `DEC-…-SUPPLY-CHAIN-001` 선례대로 **revision 을 유지(1)** 한다
- Summary 를 다음으로 교체: - Summary 를 다음으로 교체 (교체 전 문자열은 `route, API operation, env, storage, error, query, telemetry, release token을 8개 registry로 관리한다`):
> `route, API operation, env, storage, error, query, telemetry, release token, capability 를 9개 registry 로 관리한다` > `route, API operation, env, storage, error, query, telemetry, release token, capability를 9개 registry로 관리한다`
- `FE-D018` 의 Decision 셀도 같은 취지로 갱신 - `FE-D018` 의 Decision 셀도 같은 취지로 갱신
- **파급 문자열**: 이 결정을 상속 표에 복사해 둔 4개 branch — `feature-frontend-storage-registry-contract`, `feature-frontend-observability-logging-trace-contract`, `feature-frontend-contract-registry-governance`, `feature-frontend-contract-compatibility-governance` — 의 Summary 문자열을 함께 교체해야 `CONFLICTS_WITH_PROJECT_DECISION` 이 발생하지 않는다. `inherits:``@1` pin 은 revision 이 그대로이므로 수정 불필요 - **파급 문자열**: 이 결정을 상속 표에 복사해 둔 4개 branch — `feature-frontend-storage-registry-contract`, `feature-frontend-observability-logging-trace-contract`, `feature-frontend-contract-registry-governance`, `feature-frontend-contract-compatibility-governance` — 의 Summary 문자열을 함께 교체해야 `CONFLICTS_WITH_PROJECT_DECISION` 이 발생하지 않는다. `inherits:``@1` pin 은 revision 이 그대로이므로 수정 불필요
@@ -857,6 +861,12 @@ Out of scope 에 추가:
| 36 | §20 | branch 6행 + 서두 "27개"→"33개" + P4 정의 (§11.2) | | 36 | §20 | branch 6행 + 서두 "27개"→"33개" + P4 정의 (§11.2) |
| 37 | §21.2 | Cluster 6항 (§11.4) | | 37 | §21.2 | Cluster 6항 (§11.4) |
| 38 | §22.2·§22.3 | answer boundary (§10.6) | | 38 | §22.2·§22.3 | answer boundary (§10.6) |
| 39 | §23.1 | 체크리스트 "8개 registry owner" → "9개", "runbook 5종" → "runbook 7종" |
| 40 | §25 | Next Steps 에 `P4 — Opt-in runtime capability` 절 신설, 6개 branch 항목 |
| 41 | §26 | Verification Status Summary 에 `opt-in runtime capability` 행 추가 (`planned`, "설계만 존재; adapter·gate evidence `UNVERIFIED`") |
| 42 | §21 `가져온 프로젝트 계약` + frontmatter `imports` | `FE-OC-027@1`~`FE-OC-032@1` 6행/6항 추가 — **2026-07-28 실행 중 정정**. 초판은 "hub 가 정의하는 계약이므로 제외" 라 적었으나, 이 표와 배열은 `FE-OC-002`~`025` 처럼 **branch 가 owner 인** 계약을 hub 가 pin 하는 곳이고 신규 6개도 같은 관계다. 제외하면 `FE-OC-026`(hub owner)과 구분이 사라진다. gate 는 기존에도 `FE-GATE-018`·`026` 2개만 pin 되어 있어 그 성긴 패턴을 유지한다 |
§24.2 drift check 는 손대지 않는다. 정규식 `FE-D[0-9]{3}``FE-REG-[A-Z]+(-[A-Z]+)*``FE-D026`~`FE-D036``FE-REG-CAPABILITY` 를 이미 포괄하고, definition set 추출 패턴 `^\| \`FE-` 도 신규 표 행 형식과 일치한다.
### 12.2 신규 파일 6개 ### 12.2 신규 파일 6개
@@ -867,10 +877,10 @@ Out of scope 에 추가:
| 파일 | 변경 사유 | 변경 | | 파일 | 변경 사유 | 변경 |
|---|---|---| |---|---|---|
| `feature-frontend-release-cache-rollback-contract` | 결정 revision + 위임 접수 | `inherits:` `OFFLINE-CACHE-001@1`→`@2`; 상속 표 Summary 교체; `accepts_delegations` 에 `DELEG-FE-011` | | `feature-frontend-release-cache-rollback-contract` | 결정 revision + 위임 접수 | `inherits:` `OFFLINE-CACHE-001@1`→`@2`; 상속 표 Summary 교체; `accepts_delegations` 에 `DELEG-FE-011` |
| `feature-frontend-storage-registry-contract` | 문자열 파급 + 위임 접수 | `REGISTRY-001` Summary 문자열 교체; `accepts_delegations``DELEG-FE-009` | | `feature-frontend-storage-registry-contract` | 문자열 파급 + 위임 접수 | `REGISTRY-001` Summary 문자열 교체; 본문의 "8개 registry 중 하나" 1곳; `accepts_delegations` 에 `DELEG-FE-009@1` + 수신 위임 표 |
| `feature-frontend-observability-logging-trace-contract` | 문자열 파급 | `REGISTRY-001` Summary 문자열 교체 | | `feature-frontend-observability-logging-trace-contract` | 문자열 파급 | `REGISTRY-001` Summary 문자열 교체 |
| `feature-frontend-contract-registry-governance` | 문자열 파급 | `REGISTRY-001` Summary 문자열 교체 | | `feature-frontend-contract-registry-governance` | 문자열 파급 (본문 다수) | `REGISTRY-001` Summary 문자열 교체 + **본문 서술 11곳의 "8개/8 registry" → 9** (완료 조건·D1·목표·구현가이드·TODO·검증표). 이 branch 는 registry governance owner 라 개수를 여러 절에서 서술한다 — Summary 만 고치면 문서가 자기모순이 된다 |
| `feature-frontend-contract-compatibility-governance` | 문자열 파급 | `REGISTRY-001` Summary 문자열 교체 | | `feature-frontend-contract-compatibility-governance` | 문자열 파급 | `REGISTRY-001` Summary 문자열 교체 + 본문 서술 2곳 |
| `feature-runtime-schema-validation-contract` | 위임 접수 | `accepts_delegations` 에 `DELEG-FE-010` | | `feature-runtime-schema-validation-contract` | 위임 접수 | `accepts_delegations` 에 `DELEG-FE-010` |
| `feature-frontend-env-runtime-config-contract` | 신규 owner 취득 | `FE-REG-CAPABILITY` registry owner 와 `FE-GATE-033` gate owner 로서 소유 표 갱신; `WI-…-004` 완료 조건 보강 반영 | | `feature-frontend-env-runtime-config-contract` | 신규 owner 취득 | `FE-REG-CAPABILITY` registry owner 와 `FE-GATE-033` gate owner 로서 소유 표 갱신; `WI-…-004` 완료 조건 보강 반영 |
@@ -884,6 +894,8 @@ Out of scope 에 추가:
- hub §2.1.1 의 `harness/source/typed-contracts.json` 과 §2.1.3 의 `harness/source/artifact-schemas/ca-skeleton-frontend/*.schema.json` 은 **끊긴 경로**다. - hub §2.1.1 의 `harness/source/typed-contracts.json` 과 §2.1.3 의 `harness/source/artifact-schemas/ca-skeleton-frontend/*.schema.json` 은 **끊긴 경로**다.
- 결정론 검사기(`wiki_consistency_check.py`, `wiki_structure_lint.py`)가 없으므로 `CONFLICTS_WITH_PROJECT_DECISION`·`STALE_IMPORTED_CONTRACT`·`UNACCEPTED_DELEGATION` 은 자동 검출되지 않는다. §12 체크리스트의 문자열 정합은 **수기로** 확인해야 한다. - 결정론 검사기(`wiki_consistency_check.py`, `wiki_structure_lint.py`)가 없으므로 `CONFLICTS_WITH_PROJECT_DECISION`·`STALE_IMPORTED_CONTRACT`·`UNACCEPTED_DELEGATION` 은 자동 검출되지 않는다. §12 체크리스트의 문자열 정합은 **수기로** 확인해야 한다.
- 기존 branch-note 129개 전부가 frontmatter 에 `contract_packet_sha256` 을 갖는다. 이 해시를 계산하던 `branch_from_project.py` 가 삭제됐으므로 **신규 6개 노트에는 이 필드를 넣지 않았다.** 값을 지어내면 검증기가 복원됐을 때 조용히 통과하는 거짓 해시가 남는다. 기존 7개 노트를 수정하면서 그쪽 해시도 낡았다 — 생성기가 복원되면 33개 노트를 일괄 재계산해야 한다.
이 drift 는 이번 작업이 만든 것이 아니며 고치지 않는다. 다만 두 가지로 대응한다. 이 drift 는 이번 작업이 만든 것이 아니며 고치지 않는다. 다만 두 가지로 대응한다.
1. **신규 `ART-FE-*` 행을 만들지 않는다.** §2.1.3 의 등록 기준은 "두 개 이상 branch 가 같은 파일의 필드를 각자 정하는 artifact" 이고, 신규 7개 gate 의 report 는 전부 단일 branch 소유이므로 애초에 등록 대상이 아니다. 끊긴 schema 경로를 늘리지 않는 부수 효과가 있다. 1. **신규 `ART-FE-*` 행을 만들지 않는다.** §2.1.3 의 등록 기준은 "두 개 이상 branch 가 같은 파일의 필드를 각자 정하는 artifact" 이고, 신규 7개 gate 의 report 는 전부 단일 branch 소유이므로 애초에 등록 대상이 아니다. 끊긴 schema 경로를 늘리지 않는 부수 효과가 있다.
@@ -902,3 +914,15 @@ Out of scope 에 추가:
| 2026-07-28 | registry | `FE-REG-CAPABILITY` 하나만 신설 → 9개 | | 2026-07-28 | registry | `FE-REG-CAPABILITY` 하나만 신설 → 9개 |
| 2026-07-28 | 근거 자료 | project-local default 로 명시 + open question 예약 | | 2026-07-28 | 근거 자료 | project-local default 로 명시 + open question 예약 |
| 2026-07-28 | 설계 B 전체 | 승인 | | 2026-07-28 | 설계 B 전체 | 승인 |
## 15. 실행 기록
2026-07-28 에 `docs/superpowers/plans/2026-07-28-ca-skeleton-frontend-runtime-adapter-features.md` 의 12개 Task 로 전부 실행했다. 실행 중 이 문서를 세 곳 정정했다.
| 항목 | 초판 | 정정 | 사유 |
|---|---|---|---|
| §12.1 #42 | §21 `가져온 프로젝트 계약`·frontmatter `imports` 를 건드리지 않음 | `FE-OC-027@1`~`032@1` 추가 | 두 곳 모두 **branch-owned** 계약을 hub 가 pin 하는 자리다. 제외하면 hub-owned(`FE-OC-001`·`026`)와 구분이 사라진다 |
| §12.3 | `REGISTRY-001` Summary 문자열만 교체 | `contract-registry-governance` 본문 11곳, `compatibility-governance` 2곳, `storage-registry` 1곳의 개수 서술도 갱신 | Summary 만 고치면 같은 파일 안에서 "9개 registry 로 관리한다"와 "8개 registry 를 single-owner 로 관리한다"가 공존한다 |
| §13 | `contract_packet_sha256` 언급 없음 | 신규 6개 노트에 필드 미포함 + 기존 7개 해시가 낡았음을 명시 | 생성기 부재 상태에서 값을 지어내면 거짓 해시가 남는다 |
검증 결과(계획 §Task 12): 정의 없는 참조 0건, `FE-OC`·`FE-GATE` 정의 행 중복 이상 0건, 개수 정합 10항 전부 일치(FE-OC 32 / FE-GATE 33 / FE-D 36 / DEC 36 / FE-REG 9 / FE-NFR 20 / FE-RB 7 / WI 33 / 소속 노트 33 / Cluster 33), 미접수 위임 0건, 낡은 결정 문자열 0건, 깨진 wikilink 0건, 신규 문서의 과장 등급 주장 0건.