# 2026-04-09 — engine-bridge v3 scaffold (D1/D6) **이슈**: #10 follow-up (engine-bridge v3) **소요 시간**: ~95분 (HmEG 소스 survey + 3-tier 분리 디렉티브 반영 포함) **Context 사용량**: input ~165k / output ~30k tokens (Opus 4.6, 1M context, 동일 세션 누적) ## 작업 `docs/contracts/engine-bridge-v3.md` Sprint Contract 작성 후 D1/D6 구현: - `IAppManagerAccessor` 추상화 신설 — AppManager/ActiveDocument/ActiveViewport/Selection/Camera를 reflection 경계 뒤로 격리 - `ReflectionAppManagerAccessor` — loaded assemblies에서 `Editor.AppManager.AppManager` 타입 + `Instance/Current/Default` static 프로퍼티 탐색, well-known 멤버 이름 후보 체인(Selection/SelectedObjects, Camera/ActiveCamera, Position/Eye, …)로 reflection lookup, vector는 `double[]` / `float[]` / `X/Y/Z` 세 가지 shape 모두 시도 - `ReflectionEngineStateProvider` v2 stub 제거, 접근자 위임 구조로 재작성. HmEG 부재 환경(= CI)에서는 v2와 동일한 safe default 반환 - `ReflectionEngineStateProviderTests` 9 테스트 추가 — FakeAccessor로 정상값/예외/null/HmEG 부재 폴백 커버. EgPlugin 테스트 5 → 14 - 전체 suite green (100+ tests) ## 라이브 검증 대기 (D7) reflection 멤버 후보 이름은 `hmeg-candidates.json` 기반 추측. SUT 라이브에서 `curl /scene /camera /selection` 응답 받아 실제 매칭 여부 확인 후 1~2회 보정 필요. ## 전략 pivot — Reflection → HmEG 직접 참조 사용자 지적: `Recordingtest.EgPlugin`은 이미 `HmEG.dll` + `Editor03.PluginInterface.dll`을 compile-time 참조 중이다 (`.csproj` 확인). 즉 reflection으로 멤버 추측할 필요가 없고, HmEG public 타입을 직접 호출하면 된다. 이식성(generic WPF)은 포기하지만 이 프로젝트는 EG-BIM Modeler 전용이므로 합리적 trade-off. 이에 따라 사용자 동의 하에 HmEG 소스(`D:\GiteaAll\HmEngine\HmEG\HmEG`)를 read-only로 surveyed: 확인된 공개 타입 (`` 마커 기준): - `ModelBase.Uid : Guid` — 영구 고유 ID, golden file 결정성의 핵심 - `Space : ModelBase` — 문서 컨테이너. `Children`/`ItemsCount`/`Viewports` - `HmModel : ModelBase` — 형상 객체. `MouseDown/Enter/Leave` event (recorder hit-test 후보) - `HmEGViewport` (interface, namespace `HmEG`) — `CameraCore`, `Renderables`, `ViewportRectangle` - `IHmCamera` — Position/LookDirection/UpDirection (Fov는 PerspectiveCamera 캐스트 필요) - `ISelectable.IsSelected` — 노드별 (중앙 selection 리스트는 HmEG core에 없음 → Space walk + 필터) - `HmEG.IPlugin.View : EGViewport` — 플러그인이 로드 시 viewport 직접 주입받음 산출: `docs/hmeg-api-survey.md` — 발견 내용, v3 구현 방향(`HmEgDirectStateProvider` + 람다 주입), SUT-side bridge 추가 엔드포인트(`/focus`, `/hit-test`, `/command`) 설계, 미해결 7개 질문(Q1~Q7) 큐. ## 곁가지 - 사용자 질문으로 "SUT 소스 협조 wishlist" 정리 — AutomationPeer 부착, AppManager.Instance 난독화 제외, read-only 상태 API, 명령 생명주기 이벤트 등 7항목을 대화에 남김. 필요 시 `docs/sut-cooperation-wishlist.md`로 문서화. - 미커밋 변경 존재 (engine-bridge v3 scaffold + contract + hmeg-api-survey.md + 본 마지막 단계의 3-tier 분리 작업). 다음 세션에서 분리 refactor 완료 후 통합 커밋 예정. ## 아키텍처 디렉티브 — 3-tier 분리 (세션 후반) 사용자 디렉티브 두 가지가 연속해서 들어왔다: 1. "처음부터 WPF 일반인지 Modeler 테스트 자동화인지 코드 분리해놓아라" 2. "대부분의 WPF는 HmEG(3D 그래픽 엔진)을 사용하고 있으니 이점도 고려해서 테스트 자동화를 설계해라" → 즉 분리는 2-tier(generic vs SUT)가 아니라 **3-tier**: - **Generic** — 임의 WPF 응용 - **HmEG-aware** — HmEG를 호스팅하는 임의 WPF 응용 (앱 미고정) - **App-specific** — 특정 응용 (현재 EG-BIM Modeler) 의존 방향: App-specific → HmEG-aware → Generic. 역참조 금지. 본 세션에서 한 일: - `CLAUDE.md §8.1` 신규 — 3-tier 규칙, 폴더 레이아웃, 강제 사항, 현재 모듈 분류표 - `docs/contracts/generic-sut-split.md` 신규 — D1~D9 명세 (폴더/csproj 분할, 인터페이스 추출, HmegDirectStateProvider 골격, ArchitectureTests, sln 갱신) - `PLAN.md` — 본 refactor를 P0.5로 등록 (engine-bridge v3 진입 전 선결) - `PROGRESS.md` — In progress 에 해당 항목 추가 본 contract는 다음 세션에서 Generator가 단일 작업 단위로 실행한다. **engine-bridge v3 코드 진입은 본 분리 완료 후**. 이유: `HmegDirectStateProvider`는 HmEG-aware 계층에 들어가야 다른 SUT에서 재사용 가능. ## 관련 - `docs/contracts/engine-bridge-v3.md` (갱신 예정) - `docs/hmeg-api-survey.md` (신규 — 본 세션 산출) - `src/Recordingtest.EgPlugin/IAppManagerAccessor.cs` (신규 — CI fallback으로 유지) - `src/Recordingtest.EgPlugin/IEngineStateProvider.cs` (v3 1차 재작성, 다음 단계에서 HmEgDirectStateProvider 추가) - `tests/Recordingtest.EgPlugin.Tests/ReflectionEngineStateProviderTests.cs` (신규)