공개 release 발행 시 파일 본문 누출 검사(check-public-release-leakage)에 걸리던 내부 단서를 정리해 발행을 차단하지 않도록 함. - 코드/테스트 주석·문서 본문의 "" 규정 인용을 "코어 규정/규칙" 등 중립 표현으로 치환 (코어·이커머스·board·kginicis·gdpr·pay·템플릿 전 영역) - 내부 역할 호칭 ""/""를 문맥에 맞는 중립 표현으로 일반화 - config/app.php 의 보호경로 목록(G7_UPDATE_PROTECTED_PATHS) 내 파일명은 기능 코드이므로 삭제 대신 검사기 화이트리스트에 등록 주석/설명 문자열/문서 본문만 변경 — 로직·데이터·동작 무변경. 검증: 누출 재검사 error 0 / warn 0, 영향 테스트 TS 140/140·PHP 113/113 통과.
58 lines
5.4 KiB
YAML
58 lines
5.4 KiB
YAML
# audit:allow test-scenario-coverage reason: 본 매니페스트는(트리 버전 배지 레이아웃+확장 / 버전 기록·복원 / 모달 편집 스크롤 격리) 시나리오 매트릭스 SSoT. 축이 직교(5축)라 full cross product fingerprint 마킹이 실효 없고, 회귀 가드는 test_files 의 통과 테스트(Vitest 단위 18건 + PHPUnit Feature/Unit + Playwright E2E 3건 example.com 실측 + Chrome MCP 9축 매트릭스 라이브 실측 — 내부 검증 이력)로 effects 전수를 커버. 편집기 도메인 선례(layout-editor-page-state-switcher/preview-canvas)와 동일 면제 방식.
|
|
feature: 레이아웃 편집기 라우트 트리 버전 배지 + 모달 편집 캔버스 스크롤 유지
|
|
phase: S9-followup
|
|
session: S9-followup
|
|
issue: 383
|
|
axes:
|
|
edit_mode: [route, base, modal, iteration_item, extension]
|
|
version_domain: [layout, extension]
|
|
layout_history: [none, has_versions]
|
|
version_change_action: [save_first, save_repeat, restore, none]
|
|
scroll_lock_source: [modal_composite_lock, late_lock_after_mount, no_lock, non_hidden_value]
|
|
backend_response_shape: [with_layout_versions, missing_map, invalid_values, with_current_version, missing_current_version]
|
|
exclusions:
|
|
- { edit_mode: route, scroll_lock_source: modal_composite_lock,
|
|
reason: "route 모드는 모달이 isOpen 강제 마운트되지 않아 락 발생 경로 없음 — 락 축은 modal 모드 전용" }
|
|
- { version_change_action: restore, layout_history: none,
|
|
reason: "이력이 없으면 버전 기록 모달에 복원 대상이 없음" }
|
|
effects:
|
|
- editor_routes_response_includes_layout_versions_map
|
|
- layout_versions_map_only_contains_layouts_with_history
|
|
- tree_version_badge_matches_versions_map
|
|
- no_badge_for_layouts_without_history
|
|
- save_response_includes_current_version
|
|
- save_success_syncs_tree_badge_via_set_layout_version
|
|
- restore_new_version_syncs_tree_badge
|
|
- invalid_or_missing_versions_payload_degrades_to_no_badges
|
|
- modal_edit_keeps_canvas_scrollbar
|
|
- late_body_scroll_lock_is_stripped_by_mutation_observer
|
|
- non_hidden_body_overflow_values_preserved
|
|
- isolation_stops_after_editor_unmount
|
|
- extension_index_response_includes_current_version_per_extension
|
|
- extension_badge_matches_current_version
|
|
- extension_mode_version_history_modal_opens
|
|
- extension_version_list_and_restore_use_extension_api
|
|
- extension_save_response_current_version_syncs_extension_badge
|
|
- extension_restore_new_version_syncs_extension_badge
|
|
- extension_version_list_shows_creator_name
|
|
test_files:
|
|
- resources/js/core/template-engine/layout-editor/__tests__/components/VersionHistoryModal.test.tsx
|
|
- tests/Unit/Repositories/LayoutExtensionVersionRepositoryTest.php
|
|
- tests/Feature/Api/Admin/LayoutExtensionControllerTest.php
|
|
- resources/js/core/template-engine/layout-editor/__tests__/hooks/usePreviewBodyScrollIsolation.test.ts
|
|
- resources/js/core/template-engine/layout-editor/__tests__/LayoutEditorReducer.layoutVersions.test.ts
|
|
- resources/js/core/template-engine/layout-editor/__tests__/hooks/useEditorRoutes.test.tsx
|
|
- resources/js/core/template-engine/layout-editor/__tests__/hooks/useLayoutDocument.test.ts
|
|
- resources/js/core/template-engine/layout-editor/__tests__/components/RouteTreePanel.test.tsx
|
|
- tests/Unit/Repositories/LayoutVersionRepositoryTest.php
|
|
- tests/Feature/Api/Admin/AdminTemplateAssetControllerTest.php
|
|
- tests/Feature/Api/Admin/LayoutControllerTest.php
|
|
- tests/Playwright/specs/layout-editor/tree-version-badge-and-modal-scroll.spec.ts
|
|
notes:
|
|
- 버전 배지 SSoT 는 편집기 routes 응답 `layout_versions` (LayoutVersionRepository.getCurrentVersionsByTemplateId — 이력 보유 레이아웃만 최신 버전). 저장 동기화는 PUT 응답 `data.current_version`(LayoutService.updateLayout 가 saveVersion 결과를 transient 부착) → SaveResult.newContentVersion → SET_LAYOUT_VERSION. 복원 동기화는 restore 응답 `data.version` → onRestored(newVersion) → SET_LAYOUT_VERSION.
|
|
- 모달/반복 항목 편집 저장도 호스트 레이아웃 PUT(동일 경로)이라 savedLayoutName(호스트) 키로 배지가 동기화된다.
|
|
- 확장(주입 조각)은 별도 도메인(template_layout_extension_versions)으로 동일 체계 지원 — 트리 확장 노드 배지 SSoT 는 layout-extensions index 응답 `current_version`(LayoutExtensionVersionRepository.getCurrentVersionsByExtensionIds), 저장 동기화는 확장 PUT 응답 `current_version`(updateExtension transient) → SaveResult.savedExtensionId → SET_EXTENSION_VERSION, 복원 동기화는 확장 restore 응답 `data.version` → onRestored(newVersion) → SET_EXTENSION_VERSION. 버전 기록 모달은 VersionTarget(layout|extension)으로 확장 전용 API 분기(확장 단건 응답 content JSON 문자열 → full_content 파싱으로 diff 비교 경로 통일).
|
|
- version_change_action=save_first 는 baseline(v1)+저장본(v2) 두 버전 적재 → current_version=2 (LayoutControllerTest.test_can_update_layout). save_repeat/restore 의 누적은 기존 LayoutVersionIntegrationTest + useLayoutDocument 단위가 커버.
|
|
- 스크롤 락 격리는 편집기 전용(usePreviewBodyScrollIsolation — 동일 문서 렌더 부수효과 차단). 런타임 사이트의 모달 body 락은 그대로 동작(언마운트 후 무개입 단위 테스트로 가드).
|
|
- E2E 는 공유 dev DB 를 변형하지 않도록 읽기 전용 검증(배지↔맵 정합 + 모달 모드 body overflow)으로 한정 — 저장/복원 버전 동기화는 단위+Feature 가 커버.
|