Files
recordingtest/PROGRESS.md
minsung 03fb504eea BREAKING: 3-tier split step 2 + engine-bridge v3 EgBim lambdas wired
Completes the Generic / HmEG-aware / App-specific separation started in
f6b6e74. The legacy EgPlugin / EngineBridge / EngineBridge.Client /
EngineBridge.Probe modules are moved into their proper tiers, namespaces
and csproj/sln entries are renamed, and the HmegDirectStateProvider
lambdas are finally populated with real handles from the EgBim plugin
host. A new Recordingtest.Architecture.Tests project enforces the tier
rule at build time.

Moves (git mv + csproj/RootNamespace/AssemblyName rename + sln):

  src/Recordingtest.EgPlugin
    -> src/Sut/EgBim/Recordingtest.Sut.EgBim.PluginHost
  src/Recordingtest.EngineBridge
    -> src/Hmeg/Recordingtest.Hmeg.Catalog
  src/Recordingtest.EngineBridge.Client
    -> src/Hmeg/Recordingtest.Hmeg.Bridge.Client
  src/Recordingtest.EngineBridge.Probe
    -> src/Hmeg/Recordingtest.Hmeg.Catalog.Probe

  tests/Recordingtest.EgPlugin.Tests
    -> tests/Sut/EgBim/Recordingtest.Sut.EgBim.PluginHost.Tests
  tests/Recordingtest.EngineBridge.Tests
    -> tests/Hmeg/Recordingtest.Hmeg.Catalog.Tests
  tests/Recordingtest.EngineBridge.IntegrationTests
    -> tests/Hmeg/Recordingtest.Hmeg.Catalog.IntegrationTests

Namespace rename applied across all .cs files and csproj RootNamespace:

  Recordingtest.EgPlugin           -> Recordingtest.Sut.EgBim.PluginHost
  Recordingtest.EngineBridge       -> Recordingtest.Hmeg.Catalog
  Recordingtest.EngineBridge.Client -> Recordingtest.Hmeg.Bridge.Client
  Recordingtest.EngineBridge.Probe -> Recordingtest.Hmeg.Catalog.Probe

New: tests/Recordingtest.Architecture.Tests/

  DependencyGraphTests walks Assembly.GetReferencedAssemblies() for each
  tier and fails if a forbidden reference leaks in:
    - Generic modules must not reference HmEG or any app-specific DLL
    - HmEG-aware modules must not reference app-specific DLLs
    - Recordingtest.Hmeg.Bridge must reference HmEG (positive check)
  11 tests, all passing. Prevents future drift from CLAUDE.md §8.1.

Engine-bridge v3 wire-up (HmEgBridgePlugin.BuildProvider):

  Previously the HmegDirectStateProvider lambdas returned null and the
  chain fell through to reflection. They now call directly into the
  EditorPlugin base class that HmEgBridgePlugin inherits:

    spaceProvider    = () => RootSpace
                           // AppManager.ViewportManager.RootSpace
    viewportProvider = () => View
                           // EGViewport : Control, HmEGViewport
    documentPathProvider = () => AppManager?.FileManager?.CurrentFile

  Every lambda is wrapped in try/catch so plugin construction still
  cannot throw back into the SUT. Editor02.HmEGAppManager.dll added as
  a reference on Recordingtest.Sut.EgBim.PluginHost.csproj — app-
  specific tier, which is allowed by the architecture tests.

Entry points were confirmed from read-only review of the SUT sources at
  D:\GiteaAll\EG-BIM_Modeler\EditorPluginInterface\EditorPlugin.cs
  D:\GiteaAll\EG-BIM_Modeler\HmEGApplicationManagementLibrary\HmEGAppManager.cs
  D:\GiteaAll\EG-BIM_Modeler\HmEGApplicationManagementLibrary\SubManager\FileManager.cs

closing out Q1/Q2/Q6/Q7 from docs/hmeg-api-survey.md.

Tests: 115 -> 126 (+11 Architecture), 0 failures.

Next step: live verification of /scene /camera /selection with a real
SUT session; any discrepancy in HmegDirectStateProvider reflection will
be tightened after observing real HmEG camera field names.

Ref: #10 follow-up, #14 follow-up, docs/contracts/generic-sut-split.md.

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

7.6 KiB

PROGRESS.md — recordingtest

에이전트 간 공유 메모리. 세션 시작 시 PLAN.md와 함께 반드시 읽을 것. 작업 상태만 기록한다. 결정의 근거는 docs/history/, 전략은 CLAUDE.md / 메모리 참조.

저장소: https://gitea.hmac.kr/kimminsung/recordingtest SUT: EG-BIM Modeler/ (git 제외, 로컬 동봉) 현재 이슈: #2 컨텍스트 엔지니어링 & AI 개발환경 셋업


Done

날짜 항목 산출물
2026-04-07 히스토리 훅 설정 docs/history/2026-04-07_히스토리-훅-설정.md
2026-04-07 이슈 #2 리서치 & 에이전트 분해 메모리 project_recordingtest_plan.md
2026-04-07 구현 고려사항 정리 (8개 카테고리) 히스토리
2026-04-07 Golden-file 회귀 전략 채택 메모리 project_recordingtest_strategy.md
2026-04-07 CLAUDE.md 초안 + §0 협업 규칙 CLAUDE.md
2026-04-07 SUT(EG-BIM Modeler) 정적 분석 메모리 project_sut_egbim_modeler.md
2026-04-07 .claude/ agents·commands·skills·hooks 셋업 .claude/
2026-04-07 Harness design 채택 (Planner/Generator/Evaluator) CLAUDE.md §0.1, .claude/agents/planner.md, evaluator.md
2026-04-07 SUT 폴더 .gitignore .gitignore
2026-04-07 초기 Sprint Contracts 5건 작성 docs/contracts/*.md
2026-04-07 SUT 카탈로그 v0 (정적) docs/sut-catalog/catalog.md, plugins.md
2026-04-07 솔루션 스캐폴드(sut-prober PoC 타깃) recordingtest.sln, src/Recordingtest.SutProber/
2026-04-07 sut-prober PoC 구현 (Generator) src/Recordingtest.SutProber/, docs/sut-catalog/{plugins,json-configs,assemblies}.json
2026-04-07 sut-prober PoC Evaluator pass (#3) docs/contracts/sut-prober.evaluation.md
2026-04-07 diff-reporter PoC + Evaluator pass (#5) src/Recordingtest.DiffReporter*/, docs/contracts/diff-reporter.evaluation.md
2026-04-07 normalizer PoC + Evaluator pass v2 (#4) — sidecar log, explicit coverage mapping, 6 rules src/Recordingtest.Normalizer/, docs/contracts/normalizer.evaluation.md
2026-04-07 player PoC + Evaluator pass (#7) — 6 tests, no fixed sleeps, fake host src/Recordingtest.Player/, docs/contracts/player.evaluation.md
2026-04-07 recorder PoC + Evaluator pass v2 (#6) — drag state machine, focus events, ts/raw_coord src/Recordingtest.Recorder/, docs/contracts/recorder.evaluation.md
2026-04-07 test-runner PoC + Evaluator pass (#8) — 5-module E2E 파이프라인, 6 tests, DI src/Recordingtest.Runner/, docs/contracts/test-runner.evaluation.md
2026-04-07 engine-bridge PoC v1 + Evaluator pass (#9) — 정적 분석, HmEG 내부 후보 8000+, API 초안 src/Recordingtest.EngineBridge*/, docs/engine-catalog/, docs/engine-bridge-probe-design.md
2026-04-07 engine-bridge v2 + Evaluator pass (#10) — MEF plugin masquerade, HttpListener, HmEgHttpSnapshot, 11 tests src/Recordingtest.EgPlugin/, src/Recordingtest.EngineBridge.Client/, docs/guides/engine-bridge-deploy.md
2026-04-07 라이브 SUT smoke test 가이드 작성 docs/guides/smoke-test.md
2026-04-07 Smoke test 1회차 — integration gap 4개 발견 (recorder target null, VK 코드, player enum, null guard) scenarios/box-create.yaml
2026-04-07 Smoke gap fix + Evaluator pass (#11) — STAThread, KeyTranslator, 60 tests, regression trap 검증 commit 139fbbc
2026-04-07 Smoke test 1회차 — recorder PID attach + UIA target 정상 (box-v4), player 재생 부분 실패 docs/history/2026-04-07_smoke-1회차-결과.md, scenarios/box-v4*.yaml
2026-04-07 Smoke 2차 gap fix + Evaluator pass (#12) — full-path resolver, type target inheritance, window filter, UTF-8 BOM-less, 71 tests commit 8784fec
2026-04-07 sut-prober snake_case + scaffolding review 1회차 commit 0f0324e
2026-04-07 normalizer follow-ups + Evaluator pass — float epsilon 구성화 + JSON-path 마스크 스코핑, 77 tests commit eeee3c2
2026-04-08 Smoke test 2회차 — 첫 E2E 성공 🎉 Box geometry 생성 확인 docs/history/2026-04-08_smoke-2회차-첫-e2e-성공.md, scenarios/box-v5*.yaml
2026-04-08 이슈 #13 Gap E/F/G fix — HotkeyParseTests + FocusEventFilter + WindowPointResolver, 94 tests docs/history/2026-04-08_이슈13-smoke3-fix-generator.md
2026-04-08 이슈 #14 Raw 시나리오 E2E 성공 🎉 수동 cleanup 없이 box-v6.yaml 재생으로 Box 생성 player: null-target fallback + foreground switch + leading alt+tab strip + timing preservation, 24 player tests
2026-04-09 engine-bridge v3 D1/D6 scaffold (reflection accessor + 9 tests, EgPlugin) IAppManagerAccessor, ReflectionEngineStateProvider, 14 EgPlugin tests
2026-04-09 HmEG 소스 survey + docs/hmeg-api-survey.md Q1~Q7 식별, HmegDirectStateProvider 설계 근거
2026-04-09 3-tier 분리 1단계 (incremental)Recordingtest.Bridge.Abstractions (Generic) + Recordingtest.Hmeg.Bridge (HmEG-aware) 신설, HmegDirectStateProvider + ChainedEngineStateProvider wire-up, 115 tests commit f6b6e74
2026-04-09 3-tier 분리 2단계EgPluginSut/EgBim/Recordingtest.Sut.EgBim.PluginHost, EngineBridgeHmeg/Recordingtest.Hmeg.Catalog, EngineBridge.ClientHmeg/Recordingtest.Hmeg.Bridge.Client, EngineBridge.ProbeHmeg/Recordingtest.Hmeg.Catalog.Probe, 테스트 동일. Recordingtest.Architecture.Tests 11건 추가 (의존 그래프 강제). 126 tests commit pending
2026-04-09 engine-bridge v3 EgBim 람다 wire-upEditorPlugin base 직접 사용: RootSpace, View(EGViewport:HmEGViewport), AppManager.FileManager.CurrentFile. HmegDirectStateProvider 이제 실값 가능. Editor02.HmEGAppManager.dll 참조 추가. 라이브 검증 대기 commit pending

In progress

  • engine-bridge v3 라이브 검증 대기 — 코드 쪽은 완료 (EditorPlugin.RootSpace/View/AppManager.FileManager.CurrentFile 실 매핑). 사용자 환경에서 curl /scene /camera /selection로 실값 확인 필요.

Follow-ups

  • sut-prober JSON naming snake_case — commit 0f0324e
  • normalizer: mask_volatile_settings JSON-path 스코핑 — commit eeee3c2
  • normalizer: float epsilon 구성화 — commit eeee3c2
  • diff-reporter: 실제 diff-triager 에이전트 통합 테스트. non-blocking.
  • recorder/player: 라이브 SUT 수동 smoke test — 60 FPS / 10회 중 9회 reliability DoD는 샌드박스 unit test 불가, 실제 환경에서 검증 필요.
  • player: wait_for UIA 이벤트 매핑 강화 (현재 host passthrough).
  • player: UiaPlayerHost uia_path resolver가 마지막 @AutomationId만 사용 — 전체 ancestor chain 지원 필요.
  • recorder: IME 조합 키 처리 (contract risks).
  • player: foreground settle 안정화 — 능동 대기(GetForegroundWindow polling 2s + 100ms settle)로 전환, 1차 재생 성공 확인
  • [~] recorder Gap I-1 — UIA Automation.FocusedElement 폴링 PoC 시도(commit pending). 결과: SUT의 CommandBox 등 AutomationPeer 미부착 컨트롤은 UIA 외부에서 본질적으로 못 봄. deferred — generic WPF DLL injection 또는 SUT-side AutomationPeer 부착 PoC가 필요. 현재는 Player fallback(null target → OS 키 입력 / raw_coord 클릭)이 공식 전략.

Blocked

(없음)

Recent regression runs

(러너 미구현 — /regress 사용 불가)

Scaffolding review

  • 마지막 감사: 2026-04-07 (초기 셋업)
  • 다음 감사 권장: PoC 3개 완료 후