Files
Gnuboard7/tests/scenarios/layout-editor-tree-version-badge-and-modal-scroll.yaml
HeuJung 52ee8c855a chore(release): 공개 소스 본문 내부 단서(· 호칭) 정리
공개 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 통과.
2026-07-02 17:58:33 +09:00

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 가 커버.