diff --git a/docs/superpowers/specs/2026-08-17-techlog-backend-alignment-design.md b/docs/superpowers/specs/2026-08-17-techlog-backend-alignment-design.md index d0830b3..08cc9e3 100644 --- a/docs/superpowers/specs/2026-08-17-techlog-backend-alignment-design.md +++ b/docs/superpowers/specs/2026-08-17-techlog-backend-alignment-design.md @@ -7,8 +7,15 @@ - 원본 요구: `/home/donghyeon/workspace/tech-log-alignment-design/01-tech-log-frontend-alignment-design.md` - Canonical 계약: `/home/donghyeon/workspace/tech-log-design-package/contracts/openapi/studio-v1.yaml` - Specification Version `2.0.0` - - 계약 digest `sha256:85a65004f29880334b9a0a3b54089450a898f1a815f679b2985b87ed8723df5b` - - 설계 패키지 revision `0ec5582` + - **digest·revision의 단일 기록처는 `src/features/tech-log/contracts/studio/canonical-source.json`이다.** + 이 문서는 그 값을 복제하지 않는다. 승인 시점에 여기 적혀 있던 + `sha256:85a65004…` / revision `0ec5582`은 구현 중 canonical yaml이 갱신되면서 + 무효가 됐고, 실제로 vendor·고정된 값은 `canonical-source.json`이 기록한 + `sha256:99f54f56…` / revision `ce2e748`이다(Task 12 표 3행의 `ce2e748`과 동일). + - 계약 기여(`tech-log-studio-contract-contribution.ts`)는 그 파일을 import해서 + `EXTERNAL_PACKAGE` provenance를 채우고, `check:tech-log-contract`가 vendor + 사본·`generated.ts`와의 일치를 검증한다. 두 곳이 다시 갈라질 수 있는 지점은 + 없다. - 결정: 현재 Public/Studio UI 기준선을 고정하고, Studio 계약·전송 경계와 Asset capability를 canonical 계약에 정합시킨다. Public 조회의 HTTP 전환은 이 사이클에서 제외한다. ### Task 12 완료 상태 (2026-08-18) @@ -20,7 +27,7 @@ |---|---|---|---| | 1 | 현재 Public UI·라우트가 변경되지 않는다 | 충족 | Public 화면 테스트(`public-document-screens.test.tsx` 등) 무변경 통과; `case-body-renderer.tsx`/`evidence-figure.tsx`는 `9e5fbd1..HEAD` 사이 diff가 비어 있어 렌더러 코드에 변경이 없다(`check:architecture`/`check:registries`는 import 그래프·레지스트리 정합만 보고 Public 렌더 출력을 관찰하지 않으므로 이 판정의 근거가 아니다). `test:visual`의 Public 스냅샷 실패는 이 브랜치가 아니라 `main`의 `79e9aa8`에서 물려받은 것이다(아래 §Task 12 참고) | | 2 | 현재 Studio 작업 흐름이 변경되지 않는다 | 충족 | 기본 `MOCK`에서 `test:tech-log`(36 files/303 tests) 전부 PASS; `tech-log-studio-workflow.spec.ts` chromium 2/2 PASS | -| 3 | Studio 계약이 canonical에서 생성되고 digest 고정·drift 게이트 동작 | 충족 | `check:tech-log-contract`: "in sync: @tech-log/studio-contract@2.0.0 (ce2e748), 19 operations" | +| 3 | Studio 계약이 canonical에서 생성되고 digest 고정·drift 게이트 동작 | 충족 | `check:tech-log-contract`: "in sync: @tech-log/studio-contract@2.0.0 (ce2e748), 19 operations". 최종 fix wave에서 이 명령을 `config/ci/gates.json`의 FE-GATE-010과 `test:all`에 연결했다 — 그전까지는 손으로 칠 때만 실행돼 drift 게이트가 실질적으로 비어 있었다 | | 4 | `StudioGateway` 전체 operation이 HTTP 어댑터로 구현·MSW 검증 | 충족 | `test:unit`/`test:integration`의 HTTP·MSW 계약 스위트 PASS (환경 요인 실패 1건 제외, 아래 참고) | | 5 | WorkingCopy 저장이 Public Projection을 변경하지 않는다 | 충족 | `studio-publication-flow.test.tsx`, `public-document-screens.test.tsx` PASS | | 6 | Validation/Preview/Publish가 version·dependency revision으로 묶인다 | 충족 | `studio-validation-preview.test.tsx` PASS | @@ -128,13 +135,18 @@ canonical yaml을 저장소에 vendor하고, 타입을 생성하고, **계약 `InstalledContractPackageIdentity`(`external-contract-runtime.ts:173`)는 이미 이 목적에 맞는 필드를 요구한다. ```text -packageId tech-log-studio-contract +packageId @tech-log/studio-contract version 2.0.0 (canonical info.version, exact SemVer) -digest sha256:85a65004… (canonical studio-v1.yaml의 SHA-256) +digest canonical studio-v1.yaml의 SHA-256 runtimeProtocolVersion 1 -sourceRevision 0ec5582 (설계 패키지 git revision) +sourceRevision 설계 패키지 git revision ``` +`digest`·`sourceRevision`의 실제 값은 이 문서가 아니라 +`contracts/studio/canonical-source.json`에 기록한다(§상태 참고). 계약 기여가 그 +파일을 직접 읽으므로, 문서에 값을 복제하면 갱신을 한쪽에서만 하다가 어긋난다 — +승인본이 실제로 그렇게 어긋났다. + `assertPackageIdentity`는 shape을 검증하므로 npm 레지스트리 없이 지금 사용할 수 있다. 실제 패키지 배포로 승격할 때 같은 필드를 그대로 채운다. drift 방지는 저장소 관례(`generate:*` / `check:*`)를 따르는 스크립트 한 쌍으로 강제한다.