Files
recordingtest/PLAN.md
minsung 062a285462 engine-bridge v3 live: /scene /camera /selection all real (#10)
Live end-to-end verification against EG-BIM Modeler succeeded on the
second attempt:

  /health    -> {"status":"ok","port":38080}
  /scene     -> {"object_count":4,"document_path":"NewSpace0"}
  /camera    -> {"eye":[192.97,-328.52,170.72],
                 "target":[33.03,-72.61,10.78],
                 "up":[0,0,1],"fov":45}
  /selection -> {"selected_ids":["ac0380a2-...","d9a287ee-..."]}

1st attempt returned default-zero camera. Root cause: the viewport lambda
used EditorPlugin.View, which is only populated when the plugin is
actually Run() by a user trigger; our bridge plugin just boots an HTTP
server from its constructor and never runs a command, so View stayed
null. Space access worked because RootSpace goes through AppManager,
which is populated for the whole app.

Fix (HmEgBridgePlugin.BuildProvider):

  Before: viewportProvider = () => View;
  After:  viewportProvider = () => {
              var vm = AppManager?.ViewportManager;
              if (vm is null) return null;
              return vm.FocusedViewport ?? vm.Viewports.FirstOrDefault();
          };

Confirmed against read-only view of
  HmEGApplicationManagementLibrary/SubManager/ViewportManager.cs
which exposes FocusedViewport and Viewports. EGViewport : HmEGViewport
so the lambda matches the Func<HmEGViewport?> contract directly.

Plus: scripts/deploy-egbim-plugin.bat for one-click deploy. Checks for
a running SUT, builds Debug, purges the legacy Recordingtest.EgPlugin
folder, cleans the destination, copies 3 DLLs (+ PDBs) into
  EG-BIM Modeler/Plugins/Recordingtest.Sut.EgBim.PluginHost/
and prints the curl commands for verification. HmEG.dll and the
Editor*.dll assemblies are deliberately NOT copied — the SUT already
supplies them.

PROGRESS.md: engine-bridge v3 row finalized; the long-running "라이브
검증 대기" item is done. PLAN.md P1 advances to the Runner <-> sidecar
integration (snapshot /scene /camera /selection at scenario end and
include in the golden baseline).

Follow-up (noted in history): document_path returned "NewSpace0" for
an unsaved scratch document — need to retest with a saved .hmeg file
to confirm the real FileManager.CurrentFile round-trip.

Ref: #10 follow-up, engine-bridge-v3 contract DoD D7 satisfied.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 11:38:51 +09:00

40 lines
2.0 KiB
Markdown

# PLAN.md — recordingtest
> 다음에 할 일의 *우선순위 큐*. 에이전트는 상단부터 집어든다.
> 비자명한 항목은 `/contract <name>` → `docs/contracts/<name>.md` 로 Sprint Contract 먼저 작성.
## P0 — 지금 바로
1. **훅 동작 검증** — SessionStart/Stop/Guard 3개 shell 스크립트를 실제로 트리거시켜 확인
- 의존: jq 설치 여부 확인
## P1 — 다음 통합 단계
4. **Runner + engine-bridge sidecar 연결** — 시나리오 실행 종료 시점에 `/scene` `/camera` `/selection` 을 한 번 더 스냅샷해 sidecar JSON으로 베이스라인에 포함. golden file의 의미적(semantic) 차원 확보.
5. ~~recorder Gap I-1~~**deferred**. UIA poller PoC 결과 본질적 한계 확인 (AutomationPeer 부재 컨트롤은 못 봄). generic WPF DLL injection 또는 AutomationPeer AI 부착 PoC가 선결.
## Follow-ups (non-blocking)
- **sut-prober snake_case JSON** — `JsonNamingPolicy.SnakeCaseLower` 적용. Evaluator가 pass 처리했지만 contract 엄격 준수를 위해 권장.
## P2 — 통합
7. **test-runner** — 시나리오 일괄 실행 + 실패 triage
- 의존: recorder + player + normalizer + diff-reporter 전부
8. **engine-bridge 탐색** — HmEG PDB 리플렉션으로 카메라/선택 상태 접근 가능 여부 확인
- Sprint Contract 필요
9. **AutomationPeer PR 전략 PoC** — SUT fork에 AI로 AutomationPeer 자동 부착 샘플
## P3 — 상시
- **Scaffolding review** (PoC 3개마다)
- **.claude/ 비계 감사** — 기사 원칙: 불필요한 비계 제거
- **history 파일 누락 체크** — Stop hook이 경고
## 규칙
- 항목을 집을 때 PROGRESS.md의 "In progress"에 기록하고 본인(에이전트명/세션) 명시.
- 비자명한 P0/P1/P2 항목은 반드시 Sprint Contract 먼저.
- Generator와 Evaluator는 같은 세션이 겸하지 않는다.
- 완료 시: evaluator pass → PROGRESS.md Done 이동 → PLAN.md 제거 → history 작성 → `/handoff`.