# v0.1.243 — QA-021 Edit Duplicate 정책 정정 (v0.1.237/238 수정)

- 버전: v0.1.243
- 분류: 48th stable seal (v0.1.366) 일괄 봉인 사이클
- 다운로드: [factory00-windows-x64-v0.1.243.zip](../../downloads/archive/factory00-windows-x64-v0.1.243.zip) (archive 보존)
- 캡처: [qa-screenshots/v0.1.243/](../../qa-screenshots/v0.1.243/)

---

## 협업자 PM 회신 (QA-021, 2026-05-20)
QA-013 (2026-05-17 확정) -> **QA-021 변경**. v0.1.237/238 구현이 구 정책 기준.
| 항목 | QA-013 (이전) | QA-021 (변경) |
|---|---|---|
| ① 메시 | Instance 참조 | **Instance 참조** (유지) |
| ② 머티리얼 | 공유 | **독립 복사 (Material.Instantiate)** [OK] |
| ③ ISensor/IActuator | 제외 (복제 안 함) | **함께 복제 + PLC IO 초기화** [OK] |
| ④ 자식 재귀 | 자식 Part 포함 | **자식 Part 포함** (유지) |

## ② 머티리얼 독립 복사 — 신규
기존 sharedMaterials 공유 -> 런타임 Emission/색상 변경 시 원본+복제본 동시 변경 -> 시뮬레이션 혼선.
`csharpstatic void DuplicateMaterials(GameObject root) {
    foreach (var rend in root.GetComponentsInChildren(true)) {        var src = rend.sharedMaterials;
        if (src == null || src.Length == 0) continue;
        var newMats = new Material[src.Length];
        for (int i = 0; i             newMats[i] = src[i] != null ? Object.Instantiate(src[i]) : null;
        rend.sharedMaterials = newMats;
    }
}
`
## ③ 컴포넌트 함께 복제 + Modbus 초기화 — 정책 반전
기존: RemoveRuntimeComponents() 호출하여 모든 MonoBehaviour Destroy변경: deep copy (JsonUtility.FromJson + ToJson) + 물리 파라미터 유지 + Modbus 매핑 초기화
`csharpstatic List DuplicateSensors(List src) {    var dst = new List();    foreach (var s in src) {
        var copy = JsonUtility.FromJson(JsonUtility.ToJson(s));        ResetSensorPlcBinding(copy);
        dst.Add(copy);
    }
    return dst;
}
`4 헬퍼: DuplicateSensors / DuplicateServoActuators / DuplicateRotaryActuators / DuplicatePneumaticActuators.

## Modbus 매핑 초기화 효과
factory00 구조 특수성: ModbusAddressMap이 **별도 dict** — 이름 -> 주소 매핑.복제된 component의 새 id 기반 이름은 ModbusAddressMap dict에서 자연 미매칭 -> "초기화" 효과 동등.
향후 component에 직접 Modbus 필드 추가 시 ResetSensorPlcBinding / ResetActuatorPlcBinding에 reset 로직 추가.
## ④ 자식 재귀 — P1 leaf-only 유지 (v0.1.238 critic 가드)
협업자 QA-021은 "자식 Part 포함 전체 복제" 명시. 그러나 factory00 P1은 leaf-only로 유지 (critic 치명 #1 회피).
자식 Part 재귀 등록은 **P2 별도 사이클** 예약 — 사용자 합의 받은 후 진행.

## 신규 헬퍼 (Bootstrap)
RegisterDuplicatedComponents(Part dup) — DuplicateCommand에서 호출.- Sensors -> _sensorDriver.RegisterSensor- Actuators / Rotary / Pneumatic -> _actuatorDriver.RegisterActuator
## RemoveRuntimeComponents -> DEAD 이름 변경
호출처 0건. 정책 변경으로 무용지물. RemoveRuntimeComponents_DEAD 이름으로 보존 (다음 사이클에서 제거).
## 변경 파일
- Assets/Scripts/Game/Factory00Bootstrap.cs (+~100라인)- DuplicateCommand.Execute: RemoveRuntimeComponents 호출 제거, DuplicateMaterials + 4 헬퍼 호출- DuplicateMaterials (static, ~15라인)- DuplicateSensors / Servo / Rotary / Pneumatic 4 헬퍼 (~50라인)- ResetSensorPlcBinding / ResetActuatorPlcBinding 2 헬퍼 (현재 빈 구현)- Bootstrap RegisterDuplicatedComponents(Part dup) 신규 internal 헬퍼
## 검증 시나리오 (PM checklist QA-021)
1. 부품 1개에 Servo + Sensor 부착 + Modbus 주소 매핑 후 Duplicate
2. **확인 1**: 복제본에 Servo + Sensor 모두 부착됨 [OK] (이전: 제거됨)
3. **확인 2**: 복제본 Modbus 매핑 비어있음 [OK] (이름 변경으로 자동 분리)
4. **확인 3**: 원본 머티리얼 Emission 변경 -> 복제본 영향 X [OK] (sharedMaterials 분리)
5. **확인 4**: 물리 파라미터 (속도/스트로크/감지범위) 유지 [OK]

## 다음 사이클
- QA-007/008/009/031/052 UI 이벤트 전파 일괄 (v0.1.244)- QA-036/037 프로퍼티 패널 입력 fix- QA-014 Persp/Ortho 퇴행 추적- QA-019 P1.2 Vacuum Inspector UI


---

## 봉인 참조

본 사이클은 **48th stable seal (v0.1.366, 2026-05-24)** 일괄 봉인에 포함됨.

- journal: [2026-05-24-v0.1.298-366-48th-stable-seal.md](../../journal/2026-05-24-v0.1.298-366-48th-stable-seal.md)
- alias zip: [factory00-windows-x64-v0.1.366-stable.zip](../../downloads/factory00-windows-x64-v0.1.366-stable.zip) (170 MB)
