마지막 fetch: 2026-06-10 08:17 KST · 협업자 repo: plcmanjp/codeless-digital-twin-builder-develop · HEAD 07b74ce
[0] 신규 spec 진입 검토
협업자 r071~118 · 본 cap 진척 v0.1.549 (QA-116 반복 STEP import 부모 Part id 충돌 fix · 2026-06-04) — S0048 PLC 어드레스 에디터 풀스택(C1~C6c) + MX Component 실 통신 통합 + 협업자 QC 대응(QA-136 불러오기 카메라 / QA-151 box-select / QA-150 에디터 닫기 / QA-149 백업 / QA-146 backface cascade / QA-130·119·129). 다음 = PM Stage 2 QC 회신 → 58th stable seal. 옛 seal: 57th v0.1.426 · 51st v0.1.387 REAL FIX
MX 실통신 v0.1.511 + MC v0.1.512 완료
실 PLC read/write Stage 2
대기 2 (구조 변경)
Modbus 잔존 ↓
사용자 명시 (2026-05-22): Modbus 우선순위 ↓, MX Component 우선 + "협업자 pull / SDK 확인 / 설치 / 후속 구현 모두 자율".
자율 사이클 47~73 mock 100% → v0.1.510~511 실 통신 통합 완료 (MxBridge.exe x86 ActUtlType early binding 빌드+번들+auto-launch, default off). 실 PLC read/write만 Stage 2 (GX Simulator 국번 GUI).
ADR-PM-0001 r004 (2026-05-25): MC Protocol 풀스택 재도입 완료 (v0.1.512, 2026-06-02) — MELSOFT 미설치 환경 납품 대응. SLMP 3E 독립 TCP 드라이버 8파일 + 골든 프레임 13/13 PASS (handoff-002 QJ71E71-100 실측) + critic 2-pass. mock default, 실 PLC read/write는 Ethernet 모듈/SLMP 시뮬 Stage 2 (checklist 2단계 PM).
-
완료 5건 통합 (mock SDK 대기 1건 포함)
spec 5건 P1+ 완료 — 본 cap 46th~57th seal 누적
| spec | 완료 상태 | seal |
| MX Component (Tier C-1) | P1.1~P1.7 → v0.1.511 실 통신 통합 완료 (MxBridge.exe 번들+auto-launch, default off). 실 PLC read/write Stage 2 | v0.1.292 46th |
| studio-panel-resize-pin P1 | 패널 hover accent + PanelResizedEvent. P2 (접기/압정/오토하이드) 추가 완료 | v0.1.276~288 44th |
| studio-hamburger-lnb (r072) | P1.4 AppQuitCommandEvent 자율 완료. P1.1~P1.3/P1.5~P1.6 = 큰 구조 변경 사용자 명시 영역 | v0.1.297 47th |
| tower-lamp (r070) | Inspector 7-preset + Modbus Bridge + Emission HDR. JP r108: S0009 스펙 변경 (1 오브젝트 1 램프) 후 재구현 대기 | v0.1.288 44th |
| edit-copy-cut-paste (r073) | P1+P2+P3 100% — Ctrl+C/V/X + Edit 탭 + 씬 우클릭 + Cut 옵션 B | v0.1.285~289 45th |
상세 release-notes: v0.1.292 · v0.1.288 · v0.1.290
-
대기 — 큰 구조 변경 (P1 진입 시 사용자 명시 필요)
component-scene-inspector-ux (r072
4344939)
컴포넌트 씬 Gizmo + 부품 리스트 자식 노드 + Inspector 전환 UX (~300라인, 4종세트 완비). 사전 분석 340라인: pre-check.md
[1] PM 회신 필요 / 개발자 답변 대기
우선 1
진단 1
재확인 1
NEW · handshake r003 추가 10건
-
fix 완료 — v0.1.342~352 P2 PoC 사이클 누적
QA-090 · Measure/Angle/Collision 씬 오버레이 + CAD 치수선 + 오스냅 (S0038 통합)
fix 완료: P2-A 씬 오버레이 (v0.1.342~343) / P2-B CAD 치수선 (v0.1.351~352) / P2-C 오스냅 (Mesh.vertices nearest neighbor 임계값 10mm) 누적. RuntimeGizmo + factory00/OutlineAlwaysOnTop 셰이더 SSOT 사용. PM 재검증 요청: 최신 빌드 (v0.1.440 stable swap PASS) 에서 Measure/Angle/Collision 동작 확인 부탁드립니다. 상세:
v0.1.343.md + v0.1.352.md
-
NEW · 5건 통합 답변
QA-091/092/094/095/096 · 미진행 신규 spec 5건 자체 측 기술 답변 (handshake r003, 2026-05-23~24)
| spec | 답변 요지 | 추정 |
| QA-091 S0046 씬 마커 PoC | RuntimeGizmo + OutlineAlwaysOnTop 셰이더 SSOT 활용 가능. Play/Edit Mode 토글 = Application.isPlaying | PoC 2일 |
| QA-092 S0047 좌표계 승격 | CoordinateFrame struct 추상화 — 현재 mm Transform.localPosition 기반에서 분리. P3 후순위 | 5~8 사이클 |
| QA-094 S0002 r004 A/B 포트 센서 | PhotoSensor 패턴 미러 + EventBus 통합 + Inspector 램프 HUD. S0046 §6-6 P1 격상 동의 | 2~3 사이클 |
| QA-095 S0048 PLC 어드레스 인디렉션 | inline modbus 필드 → PlcAddressMap 인디렉션. ModbusAddressMap SSOT 이미 존재 | 5~8 사이클 |
| QA-096 S0050 회전형 공압 분리 | RotaryActuator (v0.1.161) 패턴 SSOT 미러. S0001 그리퍼 r003 cross-link 동의 | 1~2 사이클 |
QA-093 (E-Stop hotfix) v0.1.389 PM spot-check 종결, QA-097 (메뉴바 click 미닫힘) v0.1.414 fix 완료. PM 우선순위 결정 요청 — 본 5건 P1.5 진입 순서.
-
NEW · 소급 spec 정합성
S0051 · STEP 임포트 소급 스펙 (협업자 r094 wrap-up 등록, 2026-05-23)
자체 측 진행: v0.1.325 STEP 임포트 PoC → v0.1.331 hierarchy fix까지 7 사이클 누적. cadquery-ocp 7.9.3 + Python 3.11.9 embedded (Tools/converter-py-slim 411MB → 빌드 zip 동봉). 회기 검증 MD5 hash 일치. S0051 spec 본문 확인 후 자체 구현 정합성 점검 + gap 발견 시 다음 사이클 큐 등록. spec 본문 회신 요청.
-
NEW · r131 신규 발행 (2026-05-27)
QA-123/124/125 · v0.1.440 QC 전수 검토 결과 3건 신규 (협업자 r131~r134 누적) · PM 처리 2026-06-05 QA-123→QA-130 카메라 입력 클러스터 통합 종결(r012, git rm) / QA-124 child 단일 해소(r011) / QA-125 Won't Fix 결정 대기
| QA | 긴급도 | 영역 | 자체 측 대응 |
| QA-123 | 중 | WASD 이동 중 키 입력 무효 (전 모드, v0.1.440 발견) | 자체 측 진단 완료 (2026-05-27): root cause 후보 = Bootstrap.cs L4552-4556 옛 24oo focus-dummy polling 코드 (v0.1.024 추정, v0.1.389 이전 영역 일치). 옵션 B 가드 1줄 추가 권장 (사용자 14 시나리오 PASS 후 진입). 상세: qa-123-wasd-input-diagnostic.md |
| QA-124 | 낮음 | UI root 하위 3 children 빈 이름 + width/height NaN | Label · AxisIndicatorElement · HelpOverlayElement — v0.1.389 이전부터. name 부여 + NaN 원인 분석. 자율 진단 가능 |
| QA-125 | 낮음 | Unity 6 Cursor.defaultCursorId field not found | SetBuiltinCursor cursorId 호출 graceful fallback. Cursor.SetCursor 또는 UI Toolkit cursor USS 대체 검토 OR Won't Fix 종결 결정 필요 |
STD-0006/0007/0008 신설 (협업자 r132, STD-0002 deprecated 흡수): physics-deltatime / communication-driver / factory00-immutable-principles. 자체 측 정합 점검 자율 가능.
STD-0009 신설 (r137, 2026-05-28): Unit Display Standard — 표시·입력 단위 mm 통일 (저장은 m 유지). 본 cap 사전 분석 (cycle 30): 자체 측 grep 결과 = (m) 라벨 1건 잔존 (Bootstrap.cs L6293 "거리(m)" SensingDistance) / (mm) 라벨 다수 정합 / UnitDisplay 헬퍼 미존재. 자체 측 룰 unit-mm-conversion.md (사용자 입력 m 가정) vs STD-0009 (사용자 입력 mm 가정) 정합 불일치 → 룰 갱신 의무. Phase 적용 = P1 Measure / P2 구동부 / P3 센서 / P4 Inspector 위치 횡단. 본 변경은 UI 가시 변화 → 사용자 명시 후 자율 진입.
STD-0006/0007/0008 audit (cycle 31~32): STD-0006 (deltatime) 정합 PASS (ActuatorDriver.cs L105 float dt = Time.deltaTime + 위반 패턴 0건). STD-0008 (4대 불변) 정합 PASS (자체 CLAUDE.md 핵심 범위 결정 4가지 미러). STD-0007 (통신 드라이버 5종) gap: Modbus 5종 정합 / Plc 5종 존재하지만 PlcDeviceValueChangedEvent (자체) vs PlcSignalChangedEvent (STD-0007 명명) 불일치. 의미 동등이지만 spec 명명 미러 정합 의무 — rename + 호출처 grep 큰 변경. 사용자 명시 후 자율 진입.
-
NEW · r137~138 발행 (2026-05-27)
QA-126/127/128/129 · ORDER-004 Phase 1 PM spot-check 결과 4건 신규 (협업자 r137~138) · PM 처리 2026-06-05 QA-127 종결(v0.1.483·PM QC) / QA-126 R-7 종결(v0.1.517 PM PASS) / QA-129 Fix A PASS·Fix B(ServoAxisVisualizer) 구현 / QA-128 fix(v0.1.445)
| QA | 긴급도 | 영역 | 자체 측 대응 가설 |
| QA-127 | 긴급 | 컴포넌트 추가 시 응답없음 + 엉뚱한 오브젝트에 센서 추가 (v0.1.442 ORDER-004 Phase 1 spot-check 중 2회 재현) | fix 완료 (v0.1.483, 2026-05-29) — 확정 root cause = RebuildVisibleParts O(N²×depth) quadratic (IsPartVisible 이 조상마다 전체 Parts 선형 스캔). _partById O(1) 사전으로 freeze 제거 → stray attach 동시 해소 (freeze 가 공통 원인). 후보 B Modbus 5초 hang = mock skeleton 이라 반증. critic 2차 PASS. [3] 답변 참조. Stage 2 재spot-check 부탁 |
| QA-126 | P0 | S0005 PhotoSensor PM spot-check 탈락 (R-1~R-7 7건) — 중복 차단·READ ONLY 필드·LocalRotation 드래그·IsVisualized 무효·감지 영역 vs 시각 영역·NO/NC 즉시 갱신 | 본 cap 사전 분석 (자율 cycle 21): S0005 r004 spec 본문 fetch 후 자체 측 vs r004 gap 7건 식별. 자율 가능 small/audit: R-1 중복 부착 차단 (~5줄) / R-2 SensingDistance FloatField ReadOnly 제거 (~3줄) / R-5 감지 영역 OverlapSphere + 각도 정합 audit (v0.1.146 등 fix 이력) / R-6 OnContactTypeChanged 콜백 (~5줄). 사용자 명시 의무 큰 영역: R-3 LocalRotation Vector3FieldElement SSOT (~30줄) / R-4 IsVisualized Visualizer SetActive 바인딩 (~10줄) / R-7 SensorDetectedEvent Raw 이벤트 분리 (~20줄). 다음 cap fix path = R-1+R-2+R-6 1 사이클 + R-3+R-4+R-7 2~3 사이클 |
| QA-129 | P1 | S0003 서보축 모니터링 값 미갱신 (Stopped 고정·현재위치 0 고정·간헐 갱신) + 구동 범위 씬 미표시 (직진 실린더는 정상) | 본 cap 사전 분석 (자율 cycle 22): S0003 r004 spec 본문 fetch 후 자체 측 ServoAxisActuator (v0.1.154) UpdateActuator 본문 audit. UpdateActuator 본문 정상 (L138 CurrentPos += CurrentVelocity * dt) — Stopped/AtRls/AtFls 상태에서만 velocity 0 수렴. 가설 1: PLC Coil ForwardCmd → state 변화 path 끊김 (ActuatorPlcBridge 미부착 또는 RequestMove() 호출 안 됨). 가설 2: Inspector RenderInspector 0.25s 주기만 갱신 (간헐 갱신 매칭). 가설 3 (r004 D-2 미적용): ActuatorType enum 옛 형식 (LinearHorizontal/LinearVertical/Rotary) 잔존 — r004 = Linear 1종 통일 의무. 다음 cap fix path: (1) ActuatorPlcBridge Coil → state 변화 진단 (2) RenderInspector 갱신 주기 검토 (3) r004 D-2안 enum 통일 (~10줄). 구동 범위 씬 표시 = S0046 §6-5/§6-7 (Mechanical RLS/FLS Visualizer 신규) |
| QA-128 | P2 | S0050 회전 실린더 회전 반경 미동작 + 파라미터 정리 (최대각도 폐기, 복귀/회전 각도·스토퍼 유지) + 구동 범위 씬 미표시 | 사양 확정 완료 (S0050 r002 + checklist r003, 2026-05-27 r137). 본 cap 사전 분석 (자율 cycle 11): 자체 측 PneumaticRotaryCylinderActuator.cs (v0.1.161) vs r002 spec gap 4건 — (R-1) MaxAngleDeg 잔존 폐기 의무 / (R-2) RotationRadiusMm 코멘트 명확화 "부품 origin → 회전 중심축 거리" / (R-3) 구동 범위 씬 표시 (원호 Visualizer 신규) / (R-4) PortArrivalSensor 회전 패턴 (S0002 r004 §5-4 미러). R-1+R-2 = small (~3줄), R-3+R-4 = 사용자 명시 의무 (Visualizer + Sensor 신규) |
STD-0009 신설 (협업자 r137, 단위 표시 표준): mm 좌표·각도 표시·소수점 정밀. 자체 측 정합 점검 자율 가능.
PM 명확화 요청 (2026-05-29):
- (1) QA-127 재검증 — v0.1.483 fix 완료 (quadratic rebuild root cause). 8763 부품 씬에서 컴포넌트 Add 후 freeze·stray attach 소멸 재spot-check 부탁드립니다 (마우스 구동 = 자동화 한계, Stage 2 사용자 PC 의무).
- (2) 다음 우선순위 — QA-127 종결 후: QA-126 (R-1~R-7 7건, PM r138 에서 사양 확정 완료 = 즉시 fix 진입 가능) vs QA-102/103 (S0042 완료 blocking) 중 어느 쪽을 먼저 fix 할지 결정 부탁드립니다.
- (3) QA-122/123 종결 확인 — QA-122 (v0.1.430 UI 미렌더링) = v0.1.440 sharedassets swap 으로 해소 추정 / QA-123 (WASD 이동 중 입력 무효) = v0.1.443 가드 fix 로 해소 추정. handshake INDEX 에는 아직 열림 — v0.1.483 재spot-check 후 종결 가능한지 확인 부탁드립니다.
[2] PM spot-check 대기
handshake INDEX r108 (2026-05-25) 정합 — 종결 28건 audit 완료, 잔존 spot-check 대기 5건
PM spot-check 통과 34
PM 대기 5 / 33
r108 정합 audit 2026-05-27
-
PM v0.1.550/551 QC PASS 종결 · 6건 (2026-06-04~05 r011~012)
PM Stage 2 실측 PASS → handshake 종결(git rm)
v0.1.550: QA-149(S0048 백업)·QA-150(PLC 에디터 닫기)·QA-151(box-select 누수)·QA-116(STEP import) / v0.1.551: QA-119(Save/Load 복원)·QA-146(backface). QA-129 Fix A 재확인 PASS. 카메라 클러스터(QA-130/123/134/136/081/087)는 QA-130 통합 → v0.1.552 2축 fix Stage 2 대기.
-
handshake stale 종결 요청 · 11건 (2026-06-04 코드 검증)
이미 fix 완료인데 handshake INDEX 미종결 — Stage 2 spot-check 후 종결 요청
자율 세션 코드 전수 검증 결과 다음 QA는 이미 fix 상태(handshake 열림은 stale): QA-098(저장경로 PlayerPrefs 영속, v0.1.269) · QA-105(Pneumatic Gizmo PartBoundsExclude, v0.1.371) · QA-110/111/114(인디케이터 lifecycle, v0.1.396~405) · QA-112(ghost row delayed Rebuild, v0.1.372) · QA-117(모두펼치기 O(N²)→O(N×depth), v0.1.415) · QA-118(옛 F2~F4 단축키 제거, v0.1.390) · QA-124(NaN name 부여, v0.1.442) · QA-128(MaxAngleDeg 폐기, v0.1.445) · QA-129 Fix B(ServoAxisVisualizer 구동범위 시각화 구현). PM Stage 2 확인 후 handshake INDEX 종결 부탁드립니다.
-
41st~42nd seal 수정 완료 · PM spot-check 대기 · 5건
QA-042 (키보드 이동 속도 슬라이더, v0.1.267) · QA-043 (URP 투명, v0.1.267) · QA-045 (Edit Tab 4 그룹, v0.1.268) · QA-050 (F11 패널 완전 접힘, v0.1.268) · QA-066 (씬 클릭 오토 트래킹, v0.1.270). 최신 stable
v0.1.440 에서 일괄 검증 가능
PM 확정 종결 28건 명단 펼치기 (r108 audit 2026-05-27)
r058 18건: QA-033/034/035/036/037/041/044/046/047/048/049/051/054/056/057/058 · r060 4건: QA-062/063/067/068/069 · r108 추가 종결: QA-006 (v0.1.319 미재현) · QA-007 (v0.1.319 미재현) · QA-008 (S0042 리본 제거로 자연 해소) · QA-009 (v0.1.319 미재현) · QA-021 (v0.1.389) · QA-028 (S0042 자연 해소) · QA-031 (v0.1.320) · QA-052 (v0.1.325) · QA-053 (Add Rotary 버튼 삭제 자연 소멸) · QA-055 (v0.1.320) · QA-070 (v0.1.325) · QA-079 (v0.1.325) · QA-080 (v0.1.325) · QA-083/084 (v0.1.325) · QA-010 (v0.1.367 부분 통과)
[3] 개발자 답변 누계
handshake.md 답변 칸 반영 · INDEX r065 정합
답변 44 (본 cap)
NEW 41 (v0.1.272~552 fix + QA-130 카메라 입력 클러스터 2축 REAL FIX + QA-143 MX 설치 + S0054 MC Protocol + S0048 C1~C3 + S0055 P1 — 옛 144건 archive 2026-05-27)
-
QA-130 카메라 입력 클러스터 — 2축 REAL FIX (v0.1.552, 2026-06-05)
v0.1.551 무효(PM 2축 root cause) → 화이트리스트 폐기 + 플래그 우선 + ALT false-trigger 차단
PM v0.1.551 QC(report-0051): 스모킹건
focused='cmd-open' IsAnyUIFocused=True = cmd-open 이 IsLnbElementFocused 화이트리스트(_lnbCmds)에 누락(v0.1.551 _lnbTabs 만 추가→재발). critic 자체검증과 PM 실측 불일치 인정. fix(PM/JP 승인 2축 동시): ①focus축 — IsLnbElementFocused(element 화이트리스트) 폐기, "카메라 의도 플래그 우선" 단순화(누락 재발 구조 제거). ②ALT축 — Alt 감지 시 WASD/QE 동시 누름이면 LeftAlt false-trigger(Unity 폴링) 무시. 진단 로그 유지. 컴파일 PASS. Stage 2: 불러오기 후 카메라 복귀 + WASD 시 ALT 미발생 + ESC 후 차단. (자동화/critic 2회 한계 인정 — PM 실측이 진실)
-
QA-130/136 — 카메라 먹통 통합 REAL FIX (v0.1.551, 2026-06-04)
QA-130(WASD ALT)+QA-136(불러오기 먹통) 통합 root cause = focus 고착. v0.1.550 무효(PM 스모킹건) → 플래그 우회 재fix
PM v0.1.550 QC(report-0050) 채택: Player.log L332
_focusDummy.Focus() 후 IsAnyUIFocused=True = Focus() 가 focus 를 안 옮김 → 내 v0.1.550 fix(_focusDummy.Focus() 추가) 무효 확정. 재fix: _cameraFocusRestorePending 플래그 — 메뉴 명령/viewport 클릭/불러오기(카메라 복귀 의도)에 set, Tab 순회/메뉴 열림(ShowLnbDropdown)에 clear. IsAnyUIFocused 가 플래그+메뉴닫힘(_lnbActiveIdx<0)+lnb element focus 시 카메라 통과(판정 우회 — Focus/Blur 무효 무관). Tab 헤더 focus 는 플래그 false→차단 유지(focus-key-isolation 양립). critic 2-pass(치명 Tab회귀→플래그 도입 / 중대 ESC stale→ShowLnbDropdown clear / IsLnbElementFocused Contains). 진단 로그 focusedElement name 복원(report-0050 요청). 컴파일 PASS. Stage 2: WASD/불러오기 후 카메라 복귀 + Tab 헤더 focus 시 WASD 차단 + Player.log focused name 확인. 마우스+키보드 조합 = 자동화 한계.
-
QA-138/136 — 카메라 먹통 root cause fix (v0.1.550, 2026-06-04)
QA-138 (시점전환 후)·QA-136 (불러오기 후) 카메라 전면 먹통 — 메뉴 명령 focus 고착이 공통 root cause
심층 검토: 카메라 입력 가드가
IsAnyUIFocused() 직결(L439) → 메뉴 명령 버튼(focusable=true, Tab 순회용)이 클릭 시 focus 잡고 안 놓음 → IsAnyUIFocused 영구 true → WASD/휠/Space/C 전면 차단. focus 복원(_focusDummy.Focus())이 OpenTwn/startup/search 3곳에만 존재 → QA-136은 OpenTwn 경로만 가려지고 시점전환·기타 메뉴 명령은 복원 누락(반복 재발). fix: HideLnbDropdown(bool restoreCameraFocus) — 메뉴 명령 클릭(L1823) + viewport 클릭(L4746) 시 _focusDummy 복원, ESC는 헤더 복귀 유지(focus-tab-navigation 충돌 회피). cascade 7곳 회귀 0. 컴파일 PASS. Stage 2: 뷰메뉴 클릭 시점전환 후 WASD/휠 카메라 복귀 확인 (마우스+키보드 조합 자동화 한계).
-
QA-129 — 서보축 모니터링 실시간 갱신 fix A (v0.1.536, 2026-06-03)
QA-129 (서보 모니터링 Stopped/0 고정·간헐) — 정적 Label + 5초 grace skip이 root cause
에이전트 심층 조사: PM 1순위(Inspector 갱신 결함) 정확, dev 가설 1(PLC path 끊김)·3(enum) 반증 — 명령 경로 3개 살아있고 서보는 실제 구동, 표시만 stale. enum은 직렬화/표시 전용(동작 무관). root cause(Fix A): 모니터링 행이 정적 Label + RenderInspector 0.25s 주기가 5초 grace(QA-106 입력필드 보호)로 skip → 얼어붙음. fix:
SensorReadonlyRowRef + card.schedule.Execute(...).Every(100)로 상태/위치/속도 텍스트만 매 100ms 갱신(카드 떠나면 자동 중단, 입력필드 부작용 0, PLC 비의존). 컴파일 PASS. 잔존 Fix B: 구동 범위 ServoAxisVisualizer 신규(다음 빌드). Stage 2: 서보 명령→값 실시간 확인.
-
QA-119 — Save/Load 삭제-재오픈 미복원 fix (v0.1.535, 2026-06-03)
QA-119 (예시2: 삭제 후 재오픈 미복원) — soft-delete 복원 (spec-implementation-judgment)
PM 가설(Instantiate 누락)은 현상은 맞으나 구조상 불가(factory00 import-only=mesh 미직렬화→단품 Instantiate 불가). 진짜 root cause(에이전트 조사): 삭제=soft-delete(SetActive false+Parts 유지)→.twn 영속→재오픈 시 byId 매칭+속성 덮어쓰기는 되나 비활성 GameObject를
SetActive(true)로 안 되살림. fix: ApplyTwnPayloadCore 매칭부에서 비활성 파트 SetActive(true) 복원. 숨김(visibility)은 Renderer.enabled 도메인이라 무관. 회귀 최소(재임포트/clear 무변경). 확인 필요: 삭제 영속 정책(_partHidden SSOT 공유라 soft vs 영구 미구분, 본 fix는 soft). 컴파일 PASS. Stage 2: A 추가→Save→삭제→Open→복원 + 정상/빈씬/Duplicate 무손상.
-
QA-149 — S0048 백업 파일 신뢰성 fix (v0.1.534, 2026-06-03)
QA-149 (긴급) — 백업 .pre-S0048.bak.twn 피커 오염 + 재귀 누적 + stale 오픈 (내 C4a 백업 코드 버그)
PM 진단(v0.1.532 QC) 채택: 백업 확장자 .twn → *.twn 피커 노출 → JP가 마이그레이션 전 스냅샷 오픈 → TowerLamp 미복구. fix: (1) 비-pickable 확장자
.pre-S0048.bak(.twn 아님 → 피커 미노출) (2) 멱등(백업 파일 재백업 skip → .bak.bak 누적 차단) (3) 기존 .pre-S0048.bak.twn 자동 rename → 비-pickable(피커/폴더 정리). S0048 마이그레이션은 비파괴적(shadow map)이라 백업은 C4 switchover 대비 안전망 — 유지 + 결함만 fix(spec-implementation-judgment). 컴파일 PASS. Stage 2: Open 시 .bak(비-.twn) 생성 + 피커 미노출 확인.
-
QA-130/123/145 — Alt 메뉴바 우클릭 회전 오발동 fix (v0.1.533, 2026-06-03)
QA-130 (우클릭 회전 후 WASD 시 메뉴바 Alt 자동 활성화) — held 마우스 가드 + 진단 로그
PM 진단(report-0046) 채택:
_altDownTime false positive → 키보드 공백 구간(otherKey 없음)에서 Alt keyup → 메뉴바 발동. fix: 기존 otherKey 검사(Input.anyKeyDown)는 새 keydown만 잡아 우클릭 회전 중 held 마우스 누락 → Alt window 중 마우스 버튼 held면 otherKey=true(메뉴바 차단). PM 명시 요청대로 진단 로그 보강(downTime set 시 LeftAlt/RightAlt 구분 + 마우스 L/R/M held / 메뉴바 발화 시 마우스 상태) → false Alt 정체 + 우클릭 연관 확정용. 컴파일 PASS. Stage 2: 우클릭 회전 후 WASD → 메뉴바 안 먹히는지 PC 검증 + 로그 확인.
-
S0055 P1 — 서브윈도우 리사이즈/이동 인프라 (v0.1.514~515, 2026-06-02)
S0055 (서브 윈도우 사이즈/위치 조정) P1 — ResizableWindowController 공통 인프라
이동/리사이즈 공통 인프라 신규(additive, 기존 코드 0 수정): 이벤트 2종(EventBus 등록) + SubWindowLayout/IResizableWindow + SubWindowLayoutStore(PlayerPrefs) + ResizableWindowController(타이틀바 드래그 + 8방향 핸들 + Min/Max·화면 클램프 + 영속화/복원). 좌패널 splitter 검증 패턴 미러. spec 상속 → factory00 POCO 패널 컴포지션 부착형 deviation. full critic(치명2+중대4 fix: capture 누수/pointerId 가드/resolvedStyle/리사이즈 클램프). 커서전환 P3.
잔존(사용자 결정 게이트): P2(기존 4 통신 패널 부착)는 침습적 — 포커스/ESC/drag-select 횡단 회귀 + 마우스 Stage 2 검증 필요. 시범 1개 패널 → 일괄 / 보류 결정 대기.
-
S0048 C1~C6c — PLC 어드레스 인디렉션 풀스택 (S0012 기획서 완전 충족 + 6모듈 격리) (v0.1.513~532, 2026-06-03)
S0048 (어드레스 인디렉션 hub) C1~C6c — S0012 4탭 매핑 에디터 기획서 완전 충족: 6 컴포넌트 할당 + 충돌 모달 + 영속, 6 모듈 격리
[C1] IPlcAddress+PlcProtocol+PortKey+PlcAddressMap(SSOT)+ModbusPlcAddress (§4). [C2] 이벤트 4종 + EventBus (§5). [C3] IAddressableComponent + 6 컴포넌트 Ports (§4-1, getter라 직렬화 X). [C4a] PlcAddressMigration 옛 필드→PlcAddressMap 등록(shadow) + .twn 1회 백업 — @Obsolete 병존(옛 필드 SSOT 유지, 기존 동작 0 변경). [C5] 컴포넌트 Inspector "통신 어드레스(read-only)" 섹션 + "설정" 버튼 → OpenAddressMappingEditorEvent 발행. [C6a] 신규 PlcAddressMappingPanel 4탭 에디터(출력/입력/데이터출력/데이터입력) — 좌측 컴포넌트 목록 + 우측 매핑 표시, 설정 버튼이 여는 실제 UI. [C6b] 좌측 미할당 포트 드래그→우측 탭 다음 빈 주소 자동 연속 할당 + 역기록 영속(PlcAddressMigration.Apply 5종, 옛 필드 SSOT write→다음 로드 재생산 소실0) + AddressMappingChangedEvent 발행 + box-select decouple. TowerLamp base+offset은 드래그 제외(C6c). critic 2-pass 누적 처리(명충돌/Protocol 캡슐화/TowerLamp 식별자/동좌표 겹침 상호배타/표시레이어 SoC/드래그 capture leak·할당 소실/Apply↔Register 6·5·4·4·1 전수 대칭). [C6c-a] 헤더 자동/수동 토글 + 수동 IntegerField 직접 입력(Enter/blur commit) → 충돌 검사(같은 device 중복) → 역기록 영속. 재진입 가드(isDelayed+SetValueWithoutNotify 루프 차단) + stale 콜백 가드. [모듈 분리 v0.1.527~528] 425라인 단일 패널 → 5 모듈(PlcTabClassifier 분류 / PlcAddressAssigner 일반할당 UI·엔진 무참조 / PortDragController 드래그 / PlcTowerLampAssigner / PlcAddressMappingPanel 뷰) 책임 격리 — 사용자 "문제 코드만 모듈화 격리" 지시 이행. [C6c-c v0.1.529~530] PlcTowerLampAssigner TowerLamp base+offset(연속 Coil 블록) 자동+수동 → 6 컴포넌트 전부 할당. critic 누적 치명 0. [C6c-b v0.1.531~532] ConfirmModal 격리 모듈 — 수동 입력 충돌 시 모달 "다음 빈 주소로 배정?" [배정]/[취소] (AssignManual ManualOutcome enum + suggested). 모달 생명주기 critic fix(Hide 정리 / Build idempotent / IsVisible 가드). 6 모듈 격리 완성, critic 누적 치명 0. 컴파일 PASS (v0.1.532).
잔존: C4 full switchover(.twn 직렬화 = 비호환, 데이터 마이그레이션 — 자율 진입 불가, 사용자 확인 의무) 만 남음. DWord 2행은 현재 DWord 포트 0건이라 생략. 에디터 드래그·수동·모달 UI = Stage 2 사용자 PC 마우스 검증(헤드리스는 in-process autoQA 제거로 자동 오픈 불가 — 컴파일+critic으로 검증).
-
QA-143 답변 — MX Component SDK 설치 완료 + MxBridge.exe 빌드 (2026-06-02)
QA-143 (PM Google Drive 전환 + 착수 요청) 3항 전수 응답
(1) 다운로드 가능 여부: Google Drive 공유 폴더 익명 다운로드 확인 (GX Works2 2.35GB / MX Component v5 ISO+업데이트 812MB / GX Works3 3.59GB 전부 octet-stream 검증). OneDrive 인증 벽 해소.
(2) 설치 완료: GX Works2 v1.635M + MX Component v5 설치 완료 + ActUtlType64 COM 등록·인스턴스화 검증. reboot 불필요. Win11 WRP 차단(vbajet32.dll 등 TrustedInstaller 소유, 관리자도 RX) → takeown+icacls 우회로 해결.
(3) MxBridge.exe 호스트 신규 빌드: Unity Mono COM 불가 → 별도 32-bit 프로세스(Tools/MxBridge/MxBridge.exe)가 ActUtlTypeLib early binding 으로 COM 호스팅 + TCP 7788 텍스트 프로토콜(MxBridgeClient.cs 정합). 검증 = PING/PONG + RECONNECT→Open()=0xF0000002(통신설정 미구성 정상 에러코드, COM 예외 아님). 잔존(Stage 2) = Communication Setting Utility 에서 GX Simulator 논리국번 구성(GUI) 후 실 PLC read/write 종단 검증.
(4) factory00 통합 게시 (v0.1.510~511): 빌드 번들(MxBridge/ 동봉) + Component auto-launch(UseMock=false 시 MxBridge.exe 자동 실행, default off + IsBridgeRunning 재사용) + PostProcessBuild(매 빌드 자동 번들). MX 실 통신 통합 자율 영역 완료 — Stage 2(GX Simulator 국번 GUI)만 잔존.
-
S0054 답변 — MC Protocol(SLMP 3E) 독립 TCP 드라이버 신규 (v0.1.512, 2026-06-02)
S0054 (MC Protocol 분리 spec) 1차 구현 + 골든 byte 검증
기술: 미쓰비시 PLC를 MELSOFT 무관 순수 TCP/IP(SLMP 3E)로 직접 read/write. MX(S0011, MxBridge COM)와 별개 기술 — 브리지 불필요, Ethernet 모듈 직접 접속. v0.1.204 폐기분을 collab S0054 분리·위임 승격 기준으로 재도입.
구현: 8 파일 신규 (디바이스코드+파싱 / 3E 프레임 encode·decode / 이벤트 5종 / IMcClient / TcpClient(실) / MockClient / DeviceMap / Component) + EventBus 5종 등록.
골든 검증 (실 PLC 없이 프레임 정확성 확정): standalone 13/13 PASS — handoff-002 QJ71E71-100 실측 프레임 + checklist BuildBatchReadWord(0xA8,100,5) byte 단위 일치. 비트 nibble upper-first 확인. Tools/McProtocol/run-golden.sh.
spec 반영: 비트 쓰기(Cmd 0x1401/Subcmd 0x0001) + 가변 AccessRoute(NetworkNo/StationNo) + 충돌 감지 + Device "D100" 문자열 이벤트 + DriverInstanceId GUID + 함정 6종(Procedure Exist 포트 / nibble / ReceiveTimeout / 부분수신 누적 / 메인스레드 마샬링 / ICMP 금지 더미 SD0 read).
품질: critic 2-pass (1차 치명3+중대6 → 8파일 rework → 2차 CONDITIONAL, 신규 중대 2건은 골든검증·의도된 MX미러로 비차단). 매핑: wiki/topics/S0054-mc-protocol-impl-mapping.md.
잔존(2단계 PM): 실 TCP read/write는 Ethernet 모듈/SLMP 시뮬 단계. mock default 유지. MELSOFT 미설치 PC 검증이 핵심 가치. P2 = EndCode 친화 메시지 / 4E 프레임 / 인접 Entry 자동 그룹핑.
-
v0.1.500 QC 결과 응답 (r156 — 신규/재오픈 8건)
QA-138/135Lit/142/141/126R-7/B-01/B-02 REAL FIX (v0.1.505~508, 2026-05-31)
PM v0.1.500 Stage 2 QC 결과(r156) 즉시 대응 — 신규 5건 + 재오픈 3건
QA-138 [긴급] (뒤/왼/아래 카메라 입력 dead, v0.1.505): root cause = v0.1.489 신설 Back/Left/Bottom enum 이
CameraViewController.Update mode dispatch switch 누락 → UpdateOrbit 미호출. fix = 3종을 UpdateOrbit case 에 추가. (PM 힌트 "ApplyMode 입력 재활성"보다 정밀 — dispatch 누락.)
QA-135 재오픈 (Lit 동기화 부작용, v0.1.505): v0.1.500 Unlit 강제가 _litMode 와 불일치. fix = 재임포트 직후 SetLitMode(_litMode) → Lit ON 이면 SwapToLitShader. 흰색 해소 유지 + Lit 정합.
QA-126 R-7 재NG (v0.1.507): v0.1.493 SensorDetectedEvent 발행은 했으나 PhotoSensorVisualizer 가 여전히 FinalOutput(딜레이) 참조. fix = SensorVisualizationData.RawDetected 추가 + visualizer effOn = d.RawDetected(즉시). PLC 신호만 딜레이 후 유지 — 분리 완결.
QA-142 (뷰 단축키 라벨, v0.1.506): F-key 바인딩 이미 정확(F4=시점모드/F5~F8). Ribbon.uxml 라벨만 정정(시점모드 F5→F4 + 정면F5/오른쪽F6/위F7/등각F8).
QA-141 (팝업 버튼 시인성, v0.1.506): M-01 취소 버튼 흰배경+흰텍스트. fix = MakeBtn 어두운 배경+화이트 텍스트 + hover(밝은 배경+블랙+굵은 테두리 glow).
QA-102 B-01 (Alt 2-state, v0.1.508): 메뉴바 헤더 focus 상태에서 단일 글자(F/E/V/C/R/T/H) → 메뉴 open(Alt 동시 불필요). B-02 (최근 ▶ hover, v0.1.508): cmd-recent PointerEnter → 하위메뉴 우측 cascade.
QA-140 (재오픈 빔 잔존): PM 1순위 = QA-135 Lit 연관 → v0.1.505 SetLitMode fix 로 셰이더 상태 정합. 2회차 재QC 권장.
QA-139 (드래그 선택 누락): PM 1순위(center 1점) 반증 — PerformDragSelect 는 이미 8 corner 스크린 AABB 교차(L9445~9453). 실제 = 방향 의미(leftToRight=overlap/rightToLeft=contains) 또는 behind-camera corner skip. 누락 부품 Stage 2 재현 필요.
QA-102 B-03 (파라미터 값 Ctrl+Z, v0.1.509): SensorFloatField(52 사용처) + SensorSliderRow(슬라이더 드래그 coalescing + valField) 에 ComponentEditCommand PushExecuted 추가 → 전 파라미터 필드 undo/redo. v0.1.500 QC 신규/재오픈 8건 + 발견 2건 전부 대응 완료.
-
QA-081 1인칭 입력 fix 확인 — 잔여 PM 재확인
QA-081 (1인칭 WASD/Space/C 미동작 + 프리셋 단축키 + BBox LookAt + 모델 소멸 — v0.1.320 재탈락)
코드 검증(handshake v0.1.532 옛 기준): 1인칭 입력 WASD/Space/C = v0.1.397 fix 확인 —
UpdateFirstPerson(CameraViewController L572) 에 W/S/A/D/Q/E + Space(up)/C(down) 이동 처리(L599-607), textFocused 가드(L593)는 QA-136 focus 고착 해제(v0.1.548)와 연동되어 정상. 프리셋 단축키 F5~F8 은 QA-014(v0.1.499) 종결. 잔여 미검증: BBox LookAt / 카메라 이동 시 모델 소멸 간헐 / F(시선감도)·G(WASD속도) 옵션 — 별도 증상. PM 재확인 요청: v0.1.549 에서 1인칭(F5) 진입 후 WASD/Space/C 동작 확인 + 잔여 3종(BBox LookAt/모델 소멸/F·G 옵션) 재현 여부 회신 부탁. 1인칭 입력은 마우스 진입(F5 키)이라 Stage 2.
-
QA-087 코드 검증 — 해소 추정, PM 재확인 요청
QA-087 (씬 Space 키 → SNB 오동작: 접힘/컴포넌트 추가)
코드 검증(spec-implementation-judgment):
sidebar-collapse-btn 은 hud-root 자손(MainHUD.uxml L14 hud-root > L24 btn)이라 hud-root 전역 Space 핸들러(Bootstrap L1928, capture phase, focused is Button 시 StopPropagation+PreventDefault, v0.1.240)가 이미 Space=Click 발화를 차단 + 모든 hud-root Button click→Blur(L1942). 씬 focus 상태의 Space 는 카메라 상승(Input.GetKey 폴링, focus 무관)이라 sidebar-collapse-btn 미발화. 현재 코드상 미재현 추정 — handshake INDEX 는 v0.1.532 옛 기준(QA-087 v0.1.389 발견 당시 vs L1928 전역 가드 적용 후). PM 재확인 요청: v0.1.549 에서 씬 클릭 후 Space → SNB 접힘/컴포넌트 추가 재현되는지 확인 부탁(재현 시 focus 잔존 element + Player.log 단서 회신).
-
QA-116 반복 STEP import 부모 id 충돌 (v0.1.549)
QA-116 (STEP import 반복 시 부모 중복 등록 + 부모 선택 시 동일 도면 전체 동조 — v0.1.389 발견, 진짜 미처리)
root cause(코드 확정):
GltfPartImporter.MakeId 가 계층 경로 name#siblingIndex 로 id 생성 — 단일 import 내만 unique. ImportGlbAsync 가 BuildParts(root.transform) 를 idPrefix="" 로 호출 → 같은 도면 재import 시 root=new GameObject(fileName)(동일 fileName) → 부모 Part id 충돌. 증상 1=Parts.AddRange 중복 등록 / 증상 2=같은 parentId 로 자식 묶여 부모 선택 시 전체 동조. fix: ImportGlbAsync 에 idPrefix 파라미터 + cmdImportStep 이 PlayerPrefs 영속 카운터(factory00.import_seq)로 import 세션마다 unique prefix(imp{seq}) 전달 → 같은 도면 재import 도 id 분리(앱 재시작에도 단조 증가). OpenTwnPath 재import 는 직후 payload id 교체라 무관. cascade: 부팅 번들 import(L312)는 1회라 idPrefix "" 안전. Stage 2 PM QC: 같은 STEP 도면 2회 import → 부모 중복 없음 + 각 부모 선택 시 해당 도면만 이동(반복 import 마우스 트리거라 자체 헤드리스 불가).
-
QA-136 불러오기 카메라 먹통 (v0.1.548)
QA-136 (프로젝트 불러온 후 카메라 조작 전면 먹통 — v0.1.492 QC, 진짜 미처리)
root cause(코드 확정): OpenTwnPath 완료 시 ListView Rebuild / payload 적용 중 UI element 가 focus 잡으면
IsAnyUIFocused()=true 고착 → camCtrl.IsTextInputFocused(L439)=IsAnyUIFocused 가드로 WASD/C/Space/휠/orbit 카메라 입력 전면 차단(휠 포함 = PM 추정 확정). L529 _focusDummy startup 고착 동종 이력. fix(방어적): OpenTwnPath 성공 완료 시 _focusDummy.Focus() → IsAnyUIFocused()=false(L531 제외) + polling 재 focus 대상과 일관, 고착 element 무관 해제. 주의: _viewportFocusAnchor 는 IsAnyUIFocused 제외 목록에 없어 Focus 시 true(카메라 차단 유지) = 함정 → _focusDummy 가 정답. Stage 2 PM QC: 불러오기 후 WASD/휠 카메라 복귀 + Player.log [QA-136] IsAnyUIFocused=false (OpenTwnPath 파일피커/Recent 마우스 트리거 + autoQA 인-프로세스 제거 → 자체 헤드리스 불가, Stage 2 영역).
-
QA-151 fix (v0.1.545 + 546 일반화)
QA-151 (포트 드래그 시 3D 씬 box-select 동시 발동 — 실제 부품 선택)
root cause(정밀 추적, 직전 진단 3후보 중 2 배제): box-select 가드(Bootstrap L4766)의 보조 차단
!overUIAtDown(= IsPointerOverUI(_lmbDownPos))은 _lmbDownPos 고정 평가라 프레임 dispatch 순서와 무관 → 후보 (a)타이밍 배제. SendToBack(QA-086 [A])은 QA-151 보고 빌드(v0.1.532) 이후(v0.1.539) 도입이라 (c) 배제. 남는 단일 원인 = IsPointerOverUI 의 panel.Pick 이 PLC 매핑 패널 영역(포트 행/헤더/빈 영역)을 누락 → overUIAtDown=false → box-select 시작. panel.Pick 누락은 QA-097 LNB dropdown 동종 이력(Bootstrap L4716, 6차 fix)으로 입증된 코드베이스 약점. fix(geometry 안전망): IsPointerOverUI 에 Pick 폴백 +6라인 — 가시 PLC 패널(_plcMappingPanel.IsVisible)의 _root.worldBound.Contains(panelPos) 시 UI 로 판정. Pick 누락/타이밍 무관 포괄, 패널 닫힘 시 무영향. box-select / click / 카메라 회전 모든 호출처 동시 보강. PortDragController 의 _plcMappingDragActive(PointerDown 즉시 set) 유지(상위 안전망 병존). PLC 패널 측 변경 0(_root/IsVisible 기존 노출 멤버 소비, 회귀 0). Stage 2 협업자 QC: 패널 열고 포트 드래그 시 부품 box-select 미발동 확인. v0.1.546 cascade: 동일 구조 4개 floating 패널(Modbus / SignalSim / ModbusTcp / Mitsubishi)로 일반화 — IsPointerOverUI 가 FloatingSubWindows() 공통 순회로 5패널 worldBound 폴백(신규 패널 1줄 등록으로 자동 포함, 모듈화 단일 지점).
-
QA-150 PLC 에디터 닫기 (v0.1.544)
QA-150 (PLC 매핑 에디터 닫기 수단 부재 — 사용자 갇힘)
root cause(코드 검증, PM 진단 A 확정) =
PlcAddressMappingPanel 은 독립 오버레이(IResizableWindow+Attach)라 기존 _subWindowOverlay backdrop / CloseSubWindow / ESC cascade 미도달 + C5 버튼(addr-mapping-open) open-only(토글 분기 없음) → 닫기 수단 전무. 다른 4 서브윈도우는 리본 재클릭 토글 있어 갇힘 아님(cascade 검토 → PLC만 대상). fix = titleBar X 닫기 버튼(Hide 연결, [B] 드래그는 WireMove 의 evt.target is Button 가드로 공존) + ESC cascade PLC 분기 편입(서브윈도우 직후, 상호배타라 순서 무충돌). 씬클릭 backdrop은 전체화면 backdrop element 신규 + z-order 재배치 구조 변경이라 Stage 2 분리. PM QC: PLC 매핑 에디터 열고 X 클릭 또는 ESC → 닫힘(패널 열기 C5 마우스라 Stage 2).
-
QA-146 backface fix (v0.1.543 + 547 cascade)
QA-146 (뒤/왼/아래 뷰 면 누락 — backface culling)
root cause =
Factory00MaterialGenerator.CreateBaseUnlit 이 single-sided URP/Unlit 머티리얼 생성 + doubleSided=true glb 만 _Cull=0 적용. 산업 STEP/glTF 메시 대부분 doubleSided=false → 카메라가 backface 보는 각도(뒤/왼/아래)에서 면 컬링 누락. PM 진단 (A) backface culling 일치. fix = CreateBaseUnlit(default+glb 단일 생성 지점)에서 모든 임포트 머티리얼 무조건 _Cull=0(CullMode.Off) + 중복 doubleSided 분기 제거. spec-implementation-judgment: 머티리얼 _Cull=0 이 normal 재계산보다 코드 최소·검증된 path. 헤드리스 검증 = 등각 뷰 캡처(qa146-default-iso.png) 모델 정상 + 양면 fix 회귀 0. PM QC: 뷰 메뉴에서 뒤/왼쪽/아래 전환 → 면 누락 소멸 확인(backface 뷰는 마우스라 Stage 2). v0.1.547 cascade: 셰이더 swap 경로(SwapToUnlitShader / SwapToLitShader 의 broken fallback + Lit↔Unlit swap 4 경로)도 _Cull 누락 잔존 발견 → ApplyDoubleSided() SSOT 헬퍼로 5 경로 일괄 양면화. Lit↔Unlit 토글 / broken 머티리얼 fallback 시에도 전방향 면 유지(정책 단일 지점).
-
v0.1.492 QC FAIL 추가 대응 (4건)
QA-106/133/097/086 REAL FIX (v0.1.501~504, 2026-05-31)
QA-106 텍스트입력 + QA-133 컨텍스트메뉴 + QA-097 서브창닫기 + QA-086 z-order
QA-106 (Inspector 텍스트 입력 불가, 4회 재탈락): 잔존 root cause = 값-변경 re-render(센서/액추에이터/타워램프 카드)가 텍스트 편집 중 발화 → 필드 destroy. fix =
IsInspectorTextInputFocused() 가드 5곳 → 텍스트 입력 편집 중 re-render skip(모델 갱신 유지). v0.1.245~412 가드에 추가. v0.1.538 견고화: 가드 헬퍼(IsInspectorTextInputFocused/IsAnyTextFieldFocused)가 타입 체크만 하면 Unity6 UI Toolkit 내부 __selectable TextElement를 놓쳐 편집 중 re-render가 통과할 수 있음 → 조상 검색(GetFirstAncestorOfType) 추가로 inner TextElement까지 텍스트 입력으로 포괄.
QA-133 (씬 우클릭 뷰 라벨 오표기): 컨텍스트 메뉴(디폴트[F1]/평면도[F2]/...)가 리본 뷰 메뉴 SSOT(정면/뒤/왼쪽/오른쪽/위/아래/등각)와 불일치 + 위(Top) 누락. fix = 리본 7방향 정합 + 잘못된 F-key 라벨 제거.
QA-097 (서브창 씬 클릭 미닫힘): backdrop 닫기 콜백 MouseDownEvent(레거시) → 씬 영역 클릭 미발화. fix = PointerDownEvent 전환(2곳, M-01 패턴).
QA-086 (서브창 z-order SNB 뒤 숨김): 두 번째 서브창이 BringToFront() 누락(첫 서브창 v0.1.404 보유). fix = root.Add 직후 BringToFront 추가. v0.1.539 [A] 재정의(진짜 root cause): v0.1.404/504 fix는 전체화면 모달(_subWindowOverlay)만 적용 — 실제 floating 서브윈도우(매핑/시뮬/인스펙터 5개)는 미적중이었음. 진짜 원인 = 5개 패널이 메뉴 드롭다운의 hud-root BringToFront(QA-079)에 밀려 SNB 뒤로 묻힘(z-order war). fix = 5개 패널(PLC매핑/Modbus매핑/시그널시뮬/ModbusTCP인스펙터/미쓰비시인스펙터) Show·Toggle에서 _root.SendToBack() → chrome(SNB/메뉴바) 아래 z-order 계층 고정(spec [A] 씬<서브윈도우<SNB<메뉴바, hud-root·모달 BringToFront 불변). PM QC: 서브윈도우 열고 메뉴 클릭 → 서브윈도우가 SNB 아래 유지 + 메뉴바 클릭 정상. v0.1.540~542 [B] 이동·리사이즈 완성: spec S0055 인프라(C1~C3: 드래그 이동 + 8방향 리사이즈 + 화면 clamp + PlayerPrefs 위치·크기 영속) 기완성 + 5개 서브윈도우 Attach 부착(매핑2: 옵션A 2층분리로 Render의 _root.Clear()가 리사이즈 핸들 삭제하는 회귀 차단 / 인스펙터2·시뮬: titleBar 드래그 + right→left 환산). critic 치명2 처리(타이틀바 위 버튼 클릭 시 창 이동 차단 evt.target is Button 가드 + BuildContent _root.Clear() 시한폭탄 제거), 중대2는 box-select가 overUIAtDown으로 titleBar 드래그를 이미 차단해 false-positive. SNB 펼침 겹침은 이제 사용자가 창을 드래그 이동해 회피. PM QC: 서브윈도우 타이틀바 드래그 이동 / 테두리 8방향 리사이즈 / 최소크기 / 닫았다 열면 위치 복원. P3(리사이즈 커서 전환 / 우클릭 위치 초기화)는 선택.
PM QC 부탁: 전부 Stage 2 마우스 — 텍스트 필드 타이핑 유지 / 우클릭 뷰 메뉴 / 서브창 씬클릭 닫기 / 서브창 SNB 아래 유지(메뉴 클릭 정상) + 타이틀바 드래그 이동·리사이즈.
-
v0.1.492 Stage 2 QC FAIL 대응
QA-014 뷰 메뉴 + QA-135 로드 흰색 REAL FIX (v0.1.499~500, 2026-05-31)
QA-014 (뷰 메뉴 카메라 무동작) + QA-135 (로드 후 전체 흰색) — PM v0.1.492 QC 재탈락/신규 2건
QA-014 root cause (코드 추적): 뷰(V) 메뉴는
GetCam()?.ApplyMode 배선됐으나 GetCam()=Camera.main.GetComponent<CameraViewController>(). controller 는 별도 GameObject("CameraViewController")에 생성 → Camera.main 에 없음 → GetCam()=null → 메뉴 no-op. F5~F8 은 controller 자체 Update 라 동작(QC와 정합). fix = controller 필드 캐시 + GetCam/GetCamCtrl 통합(DRY).
QA-135 root cause (코드 추적): 초기 로드는 Factory00MaterialGenerator(URP/Unlit, 색 정확). Open 재임포트는 StepImportService.ImportGlbAsync → ApplyShaderFallback(URP/Simple Lit 교체). Simple Lit 는 조명 반응 → 흰색 over-render. QC 로그 [step-import] shader fallback 4371 mat 이 증거. fix = ImportGlbAsync useMaterialGenerator 파라미터 — Open 재임포트는 초기-로드와 동일 Unlit 사용 + fallback skip(STEP 메뉴는 불변).
판단 (룰 spec-implementation-judgment): 둘 다 spec WHAT 충족 + HOW 는 검증된 초기-로드 path 채택(B-01·QA-119 동일 패턴 — 두 경로 불일치가 root cause).
PM QC 부탁: QA-014 = 뷰 메뉴 7종 클릭 → 카메라 전환 / QA-135 = 프로젝트 Open → 색상 복원(흰색 아님). 둘 다 Stage 2 마우스.
-
QA-103 M-01 — 종료 시 미저장 변경 확인 팝업 (v0.1.497~498, 2026-05-31)
QA-103 M-01 — 파일>종료 시 미저장 변경 확인 팝업 (Windows 표준)
배경: 직전까지 파일>종료 → 경고 없이 즉시 종료 = 데이터 손실 위험. AppQuitCommandEvent 이벤트만 존재(팝업 미구현).
구현: dirty 추적(UndoStack — 저장 시점 top 커맨드 참조 비교, undo-to-saved 시 자동 clean) + 3버튼 모달(저장 후 종료 / 저장 안 함 / 취소). SaveCurrentProject 메서드 추출(cmd-save/save-as/팝업 공유, DRY). MarkSaved 저장·신규·로드 3곳.
critic (CONDITIONAL→해소): 치명 1(저장 후 종료 close 선행 → Save As 취소 시 팝업 유실) → 저장 성공 시에만 close+quit. 중대: ESC cascade 충돌 → polling+가드 통일 / MouseDownEvent → PointerDownEvent. 치명 0/실 중대 0 → PASS.
X 버튼 (v0.1.498 완료): OS window X 버튼(타이틀바 닫기) 종료도 Application.wantsToQuit 가로채기로 dirty 시 확인 팝업. 빌드 hang 방지 = _forceQuit(AppQuitCommandEvent 구독자 설정 → 메뉴 확정·autoQA capture 모두 통과, X버튼만 dialog). autoQA capture 정상 종료로 안전 검증됨. Editor 제외(#if !UNITY_EDITOR). 비-커맨드 편집(슬라이더 등)은 dirty 미반영(v1 — 향후 보완).
PM QC 부탁: 부품 편집 후 파일>종료 → 팝업 출현 + 저장/저장안함/취소 동작 (Stage 2 마우스).
-
QA-102 B-02 ▶ + QA-103 M-items 코드 검증 (v0.1.496, 2026-05-31)
QA-102 B-02 최근 프로젝트 ▶ 하위메뉴 affordance + QA-103 M-items 종결 검증
B-02: 하위메뉴 기능은 v0.1.226 부터 이미 구현(최근 프로젝트 클릭 → ContextMenu 5개 나열). gap = ▶ 인디케이터 부재 → Ribbon.uxml 라벨에 ▶ 추가(앱 트리 ▶/▼ affordance 정합). 재구현 아닌 polish.
QA-103 M-items 검증 (룰 spec-implementation-judgment, PM 추적 v0.1.366 stale): M-02 뷰모드(CameraViewMode F1~F4+1인칭)·M-03 컴포넌트 드롭다운(cmds-model)·M-04 모니터창(SignalSimulator read-only 모니터)·M-05 신호시뮬(SignalSimulatorPanel)·M-06 통신설정(실행 메뉴 흡수)·M-09 1인칭(OnEnterFirstPerson)·M-10/11 도움말(help dropdown+About+overlay) = 모두 wired, 종결 가능. M-01 종료 팝업만 미완(AppQuitCommandEvent 이벤트 존재하나 미저장 확인 팝업 미구현) → 다음 사이클 구현 예정.
PM QC 부탁: 파일 메뉴 → 최근 프로젝트 ▶ 표시 + 클릭 시 하위메뉴 (Stage 2).
-
QA-102 B-01 — Alt+글자 mnemonic 메뉴 진입 REAL FIX (v0.1.495, 2026-05-31)
QA-102 B-01 — Alt+글자 mnemonic 무동작 → REAL FIX
root cause: Alt+글자 매핑 7개(Alt+F=파일/E=편집/V=뷰/C=부품·컴포넌트/R=실행/T=도구/H=도움말)는 v0.1.402 부터 존재했으나, 클릭 트리거가
NavigationSubmitEvent.SendEvent → 무동작. focus-tab-navigation cap 학습(UI Toolkit Navigation*Event SendEvent 실효 X)과 동일 패턴.
REAL FIX: 검증된 직접 호출 ShowLnbDropdown(idx) + _lnbTabs[idx].Focus() 로 전환(Alt-단독 활성화·키보드 메뉴 순회가 쓰는 동일 path). _altOtherKey 가 Alt-단독 중복 활성화 차단. 단일 키 T/H 는 이미 Alt 가드, F/E/V/R/C 충돌 0.
판단 (룰 spec-implementation-judgment): spec WHAT(Alt+글자→메뉴) 충족 + HOW 는 코드 검증된 path 채택(옛 NavigationSubmitEvent 무동작 확정).
PM QC 부탁: Alt+F/E/V/C/R/T/H 각각 해당 메뉴 드롭다운 열림 확인 (Stage 2 — Alt 모디파이어 자동화 한계).
-
QA-102 B-03 후속 — 컴포넌트 삭제 Undo + ComponentEditCommand 일반화 (v0.1.494, 2026-05-30)
QA-102 B-03 후속 — 컴포넌트 삭제 Ctrl+Z 복원 (추가만 가능했던 비대칭 해소)
배경: v0.1.491 에서 컴포넌트 추가는 Undo 가능해졌으나 삭제는 비대칭(Undo 불가)이었음 (직전 critic 중대).
fix: AddComponentCommand → ComponentEditCommand generic 일반화(do/undo 페어, DRY). 6개 Remove 헬퍼(서보/공압/회전공압/회전구동부/포토센서/타워램프) ExecuteAndPush 경유 — do=제거 / undo=동일 인스턴스 복원(SensingDistance/ModbusCoil/ContactType 등 설정값 그대로, 데이터 손실 0). TowerLamp Add 도 wrap(비대칭 해소) + EmissionDriver ReapplyLamp 신규(삭제 undo·추가 redo 시 material 재생성 — static ON 즉시 복원).
critic (CONDITIONAL→해소): 치명 1(Undo 가 _suppressAddRebuild 가드 우회) → Undo 도 Refresh() 경유 통일(DRY). 중대 재분류 = 비결함(re-add 상호배제는 UndoStack LIFO 가 차단) / 중간(Pneumatic visualizer churn = v0.1.491 Add undo 와 동일 lifecycle, leak 0). 치명 0 / 실 중대 0 → PASS.
PM QC 부탁: 부품에 센서/구동부/타워램프 추가 → 삭제 → Ctrl+Z 시 동일 컴포넌트 + 설정값 복원 확인 (Stage 2 마우스 구동).
-
QA-126 R-7 PhotoSensor Raw 감지 이벤트 분리 (v0.1.493, 2026-05-30) — 7건 전체 fix 완료
QA-126 R-7 — OnDelay/OffDelay가 씬 검출 이벤트까지 지연
증상 (JP 명시): 딜레이 설정이 출력뿐 아니라 씬 검출 이벤트 발화 자체를 지연. JP 요구 = "딜레이는 출력 변경만 지연, 씬 오브젝트 검출 이벤트는 딜레이 무관 즉시 발생".
root cause: raw 감지 → 딜레이 게이트(_currentOutput) → FinalOutput → SensorStateChangedEvent 단일 사슬. 씬 검출 이벤트가 출력 딜레이에 묶임.
fix (S0005 summary r004 §8 확정 사양): 이벤트 2단계 분리. SensorDetectedEvent 신규 — Raw 감지 edge 변화 시 딜레이 무관 즉시 발행(씬 시각화·인디케이터·디버그용). SensorStateChangedEvent 유지 — FinalOutput edge(딜레이+ContactType 후, PLC 출력용). PhotoSensorComponent.UpdateSensor 에 _lastPublishedRaw edge 비교 추가 + EventBus OnSensorDetected/Publish/Reset 배선 + ISensor doc.
판단 (룰 spec-implementation-judgment): QC 체크리스트 r155 "§7 확정 대기"는 stale — summary SSOT r005 §8 이벤트 목록 + §11 결정 이력 + 위임 브리프 모두 확정. 직접 검증 후 착수. 타임스탬프 필드명은 spec Timestamp 대신 코드베이스 형제 이벤트 컨벤션 TimestampSec 채택(내부 일관성, 구독은 factory00 내부).
critic PASS(치명 0/중대 0): SoC(UpdateSensor 전용, ContactType 토글 미발화) + 생명주기(Reset null) + 회귀(SensorPlcBridge 무관) 정합.
구독자 미배선: R-7 위임 브리프는 이벤트 발행 분리만 요구. 씬 시각화·인디케이터 구독자 배선 필요 시 PM 명시 후속.
PM QC 부탁: 포토센서 OnDelay/OffDelay 500ms 설정 → 씬에 부품 진입 시 SensorDetectedEvent 즉시 발화(딜레이 무관) + 출력/Modbus coil은 딜레이 후 변경 확인.
-
QA-102/103 메뉴 IA — B-07 제거 + M-07/M-08/B-06 기해결 검증 (v0.1.488~490, 2026-05-30)
S0042 메뉴 — 사용자 v0.1.487 PC 보고 fix 4건 + QA-102/103 코드 검증
사용자 v0.1.487 PC 보고 fix (v0.1.488~489): Tab 1회 2칸 이동(NavigationMoveEvent 네이티브+Update 이중 mover → 네이티브 전체 차단, Update 단일) · 3D 포커스 시 D→파일메뉴 이동(WASD가 NavigationMoveEvent 변환 → 차단) · 리스트 포커스 노란 fill 제거(1px 얇은 아웃라인) · 뷰 메뉴 카메라 프리셋 무동작(QA-014/B-06): SetPresetView 우회 무동작 → F5~F8 의 검증된 ApplyMode 직접 호출 + Back/Left/Bottom enum 신설.
QA-102 B-07 (도구 '부품이동' 제거, v0.1.490): Q-5 폐기 확정 — Ribbon.uxml + 코드 양쪽 제거.
QA-103 M-07/M-08 검증 (코드 우선 검토 룰): 도구 메뉴 측정/각도/충돌(review-measure/angle/collision) + 스크린샷/시나리오(present-screenshot/scenario-play) = 현재 코드 이미 wired (clicked 바인딩 존재, 중복 0). PM v0.1.366 보고 stale → 종결 가능. 재구현 불필요 (룰 spec-implementation-judgment).
QA-102 B-06 (전체보기/프리셋): 카메라 프리셋 v0.1.489 + Zoom Fit(view-fit) 기wired → 종결 가능.
B-03 (Ctrl+Z 컴포넌트 추가 복원, v0.1.491): root cause = Add 헬퍼가 _undoStack 미경유. fix = AddComponentCommand 신설 + 5개 Add 헬퍼(센서/서보/공압/회전/회전공압) ExecuteAndPush 경유. critic FAIL→치명 2건 해소(redo 중복 등록 driver dup 가드 / Part 삭제 후 undo NRE cachedTransform 가드). 후속: Remove 헬퍼 Undo + TowerLamp Undo 비대칭(별도 사이클).
인프라: build-and-publish.sh 로그락 race fix (v0.1.484/490 재발한 r1→r2 rm Permission denied + set -e 사망 → 잠금 해제 재시도).
B-05 (Delete 후 씬 클릭 불가, v0.1.492): DeleteSelectedPart 가 3D click drag-state(_isDragSelecting 등) reset 안 함 → 직접 Delete 후 씬 픽 차단. CutSelected v0.1.416 reset 미러 추가. B-04(Ctrl+X 후 씬 클릭)는 이미 v0.1.416 에서 fix됨 — PM v0.1.366 보고 stale → B-04/B-06/M-07/M-08 모두 종결 가능, PM QC 재확인 부탁.
-
QA-119 빈 씬 Open 부품 0 복원 fix (v0.1.487, 2026-05-30)
QA-119 Save/Load — GLB 기반 프로젝트 재임포트 fallback (`applied 0/8763` root cause)
root cause 확정: `.twn` 스키마에
stepSourcePath 만 있고 glb 경로 없음. Save 는 _lastStepPath(STEP 임포트 시만 설정)만 저장 → 기본 factory 씬(번들 glb 기반, STEP 임포트 안 함)은 stepSourcePath="" → Open 시 needAutoImport=false → 재임포트 안 됨 → [file-open] applied 0/8763 parts. PM v0.1.440 repro "factory00-project.twn" 이 정확히 이 케이스.
fix (v0.1.487): OpenTwnPath 자동 재임포트 조건 확장 — stepSourcePath 비었으면 ResolveGlbPath()(기본 번들 glb) 직접 재임포트 fallback (STEP 변환 skip). 기존 index-order id remap + ApplyTwnPayload 재사용. STEP 기반 프로젝트는 기존 경로 유지.
PM QC 부탁: 예시 3(빈 씬 → factory00-project.twn Open → 8763 부품 + 속성 복원) + 예시 2(부품 삭제 후 Open → 재생성) round-trip 재검증.
한계: 커스텀 glb(기본 외) 기반 프로젝트는 glbSourcePath 스키마 부재로 기본 glb 재임포트 → 기하 불일치 가능. 기본 factory 씬은 정합. 커스텀 glb 대응(glbSourcePath 스키마)은 별도 사이클.
-
QA-126 R-3 + R-5 fix (v0.1.486, 2026-05-30) — 7건 중 5건 fix 완료
QA-126 S0005 PhotoSensor 잔여 — R-3 회전 드래그 scrub + R-5 감지 cone 정합
R-3 (LocalRotation 드래그 scrub): root cause =
SensorVec3Field(PhotoSensor 카드)가 scrub 없는 Vector3FieldElement(내부 AxisFieldElement = 키인 only) 사용. 드래그 scrub 은 AxisFieldScrubElement 에만 존재. fix = SensorVec3Field 를 3개 AxisFieldScrubElement 로 전환 (Inspector P3 패턴 미러) → 위치/회전 드래그 활성화.
R-5 (감지 영역 ≠ 시각 영역): root cause = OverlapSphere+각도는 이미 정합이나 각도를 bounds.center 로만 측정 → 큰 오브젝트 edge 가 cone 안이어도 center 가 축 도달해야 감지. fix = center 체크 보존 + collider AABB ClosestPoint 체크 추가(OR) — object edge 가 cone 닿으면 감지. axisProj>0 가드로 전면 반구만 (뒤쪽 over-detection 차단, 직접반사형 spec 정합). critic 중대 해소.
QA-126 종합: R-1/R-2/R-3/R-5/R-6 = 5건 fix 완료 (v0.1.484+486). R-4 = 코드 버그 아님(PhotoSensorVisualizer 매 프레임 IsVisualized 평가 — 선택 중 표시는 spec §7 정합, PM 재확인 요청). R-7 = v0.1.493 fix 완료 (SensorDetectedEvent 분리 — Raw 감지 딜레이 무관 즉시 발행). QA-126 7건 전체 fix 완료. 모두 Stage 2 PC + PM QC 검증 의무.
-
QA-124 root cause fix + QA-130 진단 로그 (v0.1.485, 2026-05-30)
focus 클러스터 (QA-124/130/123) — focus-dummy 중복 root cause 확정 + Alt 진단 로그
QA-124 root cause 확정 (22빌드 미해소): focus-dummy/viewport-focus-anchor 생성 + FocusIn/Out 콜백 등록이
ForceLayoutStyles(L1573 + L4885 다회 호출) 내부에 가드 없이 위치 → 매 호출마다 신규 생성 + root.Add + 콜백 재등록. 이것이 child[6]/[7] name='focus-dummy' width=NaN 중복의 정체.
fix (v0.1.485): if (_focusDummy == null) 가드로 1회만 생성 (바로 아래 settings-VM idempotent 가드 패턴 미러). child 중복 제거 → QA-130(Alt false trigger 매개 가설 D) + QA-123(focus-dummy NaN 매개) 공유 root cause 해소 가능.
QA-130 진단 로그 (QA-134 명시 요청 충족): Alt detect 에 [alt] downTime set / [alt] otherKey=true / [alt] lnbTabs[0].Focus() 호출 + [focus-dummy] 1회 생성 가드 통과 4종 추가. 다음 PM QC 부탁: WASD 기동 시 Player.log 에 [alt] lnbTabs[0].Focus() 발화 여부 확인 — 발화하면 Alt 코드 순수 회기 확정 / 미발화하면 중복 제거로 해소 확정.
분석: 순수 WASD 로는 _altDownTime=-1 stale 가드라 Alt-up 분기 미발화가 코드상 정상 — 따라서 중복(QA-124)이 매개했을 가능성 우선. 진단 로그가 다음 QC 에서 확정. 진단 로그는 임시 (58th seal 시 제거 의무).
-
QA-126 R-1/R-2/R-6 fix 완료 (v0.1.484, 2026-05-29)
QA-126 S0005 PhotoSensor spot-check — 7건 중 3건 fix (R-1/R-2/R-6) + R-4 진단
PM r138 사양 확정 7건 중 소형 자율 3건 우선 fix:
R-1 (중복 부착 차단): AddPhotoSensorToPart 에 Count≥1 가드 추가 (구동부/타워램프 패턴 정합). Inspector "+ 센서 추가" 직접 호출 경로까지 차단.
R-2 (거리 필드 편집): SensorSliderRow editable 파라미터 → SensingDistance read-only Label → 양방향 FloatField (slider 동기 + clamp).
R-6 (NO/NC 즉시 갱신): RecomputeFinalOutput() 추출 → ContactType 토글 시 즉시 재계산 + Inspector 재렌더 (Button.clicked dispatch 후 schedule defer). critic CONDITIONAL → 중대(orphan) defer 로 해소.
R-4 진단 (코드 버그 아님 추정): PhotoSensorVisualizer.Update 가 매 프레임 visible = IsVisualized || ownerSelected 평가 — IsVisualized 바인딩 이미 존재. 체크 해제 시 ray 유지는 owner part 가 선택된 상태(Inspector 열림)라 spec §7 "선택 중 표시" 정합. PM 재확인 요청: part 선택 해제 후 ray 사라지는지 확인 — 유지되면 별도 버그.
잔여 (별도 cap): R-3 (Vector3 scrub ~30줄) · R-5 (감지 cone bounds.center → closest-point geometry) · R-7 (Raw/Output 이벤트 분리 — PM r138 사양 확정 대기). Stage 2 사용자 PC 검증 의무.
-
QA-127 root cause fix 완료 (v0.1.483, 2026-05-29)
QA-127 컴포넌트 Add 응답없음 + 센서 마구 추가 — quadratic rebuild root cause 확정
확정 root cause:
RebuildVisibleParts 가 모든 부품마다 IsPartVisible 호출 + IsPartVisible 이 조상 체인마다 전체 Parts 선형 스캔 → O(N²×depth). 8763 부품 씬에서 Add 직후 다초 freeze → OS 클릭 큐잉 풀림 → stray attach. freeze 가 두 증상(응답없음 + 마구 추가)의 공통 원인 (PM 후보 A+C+D 정합, C 가 실은 quadratic).
fix (v0.1.483): parentId→Part O(1) 사전 _partById 신설 → IsPartVisible/EnsureVisibleAncestors/GetPart 선형 스캔 제거 (O(N²×depth)→O(N×depth)) + 다중선택 Add rebuild 1회 coalesce + 같은 버튼 120ms burst 차단. critic 2차 코드리뷰 PASS (치명 0).
PM 후보 (B) Modbus 5초 hang 반증: ModbusTcpAdapter.Connect 가 mock skeleton (IsConnected=true + 로그만, TcpClient 미연결) 이라 블로킹 아님 — Add freeze 원인 아님.
Stage 2 검증 부탁: 8763 부품 씬에서 컴포넌트 Add 후 freeze·stray attach 소멸 재확인 부탁드립니다 (컴포넌트 Add = 마우스 구동, 자동화 6-path 한계 — Stage 2 사용자 PC 의무).