8.2 KiB
작업일지 — 2026-08-03
1. 하네스 점검 및 재구축
배경
/harness 로 기존 하네스 점검 요청. 감사 결과 하네스 전체가 호출 불가 상태였음.
발견된 결함과 조치
| # | 결함 | 조치 |
|---|---|---|
| D1 | .ubisam_agent/ 는 Claude Code가 로딩하지 않는 경로 — 에이전트 3·스킬 4가 사장 |
.claude/ 로 git mv, .gitignore 에 !.claude/agents/ 예외 추가 |
| D2 | ubisam-deliverable 이 참조하는 팀원 3명이 어디에도 없음 |
ubisam-analyst·ubisam-producer·ubisam-qa 신규 작성 |
| D3 | ubisam-deliverable ↔ ubisam-deliverables 한 글자 차이로 트리거 충돌 |
ubisam-deliverable-rebuild 로 리네임 + 4개 스킬 상호 경계표 |
| D4 | CLAUDE.md 하네스 포인터 불완전 | 라우팅표 + docs/harness-ubisam.md 신규 |
| D5 | TeamCreate/TeamDelete 는 이 환경에 없는 도구 |
Agent+SendMessage+TaskCreate 로 교체 |
| D6 | CLAUDE.md 의 @import X 는 잘못된 문법 — 규약 문서 5건이 세션에 로딩되지 않고 있었음 |
@X 로 정정 |
| D7 | set PYTHONUTF8=1 && 는 bash에서 무효(PYTHONUTF8=None, stdout cp949) |
PYTHONUTF8=1 py 접두형으로 9건 정정 |
| D8 | ubisam-ppt-make description이 #4A8DCB 의 # 때문에 YAML 주석으로 파싱돼 "blue"에서 절단 |
>- 블록 스칼라로 전환 |
| D9 | build_02설계_xlsx.py 가 os.makedirs 부재로 4종 전부 FileNotFoundError |
4개 저장 지점에 추가 (실행으로 4/4 생성 확인) |
소스와 어긋나 있던 하네스 기술
2026-06-18 리네임·마이그레이션이 하네스에 반영되지 않아 없는 파일·심볼을 진실원으로 지목하고 있었음.
| 하네스 기술 | 실제 |
|---|---|
SeqAutoRunPrismaticScanner.cs |
SeqAutoRunPrismatic.cs |
PAIX_PrismaticScanner.cs |
Device/IO/PAIX_PTOP.cs |
PLCController.Config.cs |
PLCContoller.Config.cs (저장소 오탈자) |
| `Views/Recipe | Manual |
"네임스페이스는 ILSOS_PrismaticScanner" |
ILSOS_PrismaticRD_PTOP.* — 옛 이름 0건 |
MotorIds |
없음 (DeviceIds/SequenceIds/SettingIds/StreamMessageNames) |
PAGE_VERIFY_DELAY_MS·WELD_START_DELAY_MS |
소스에 0건 |
PLC_HEAVY_ALARM_STATUS 처리 = SeqAutoRunPTOP.cs |
정의는 PLCController.Address.cs:20, 처리는 SeqAlarmMonitor.cs:199 |
#if SIMULATION 조건부 컴파일 |
0건. 시뮬은 런타임 isSimul 플래그. Simulation|x64 는 ILSOS_All.sln:413-416 에서 Release|x64 매핑 |
pptx 캔버스 배경 BG_SOFT |
build_deck.py:55-73 은 WHITE (BG_SOFT 는 패널·표 fill 전용) |
동명 심볼 함정 (하네스에 명시): 공유 클래스
WeldingCommon.Devices.Laser.PAIX_PrismaticScanner와WeldingComponents/.../PLCController.Config.cs(오탈자 없음)는 개명되지 않고 그대로 존재한다. 머신 쪽과 혼동하면 안 됨.SeqTestRun.cs:32가 공유 쪽을 참조.
환각 방지 설계
보고서 템플릿에 실측인 척하는 수치(빌드 45s/60s, T+50ms, PLC M10)가 박혀 있어 에이전트가 복사할
위험이 있었음 → 전부 플레이스홀더 + 미측정/불명확 — 확인 필요 표기 규칙으로 교체.
ubisam-format-map 에는 타 프로젝트 값(LGIT_구미_FMM, PL명, 계약일)이 "이 프로젝트 고정값"으로
박혀 있었음 — 잔재 소탕이 목적인 하네스가 스스로 잔재를 공급하고 검증가가 정답으로 대조하는 구조라 삭제.
M70000/D70000 계열 PLC 주소는 .cs 소스에 0건이고 근거 분석 문서 2건이 서로 다르게 기술 →
빌드 스크립트 출력에 (제안) 부착 + 재확인 경고 삽입.
채점 (서브에이전트 2인 독립, 6라운드)
| 라운드 | 감사관 | 드라이런 |
|---|---|---|
| 1 | 64 | 45 |
| 2 | 73 | 68 |
| 3 | 72 | 72 |
| 4 | 78 | 76 |
| 5 | 77 | 76 |
| 6 | 79 | 80 |
최종 상태: 에이전트 6 / 스킬 11, dead link 0, frontmatter 절단 0, 200줄 초과 0, CI YAML 파싱 OK, 빌드 스크립트 4종 컴파일·실행 OK.
2. Serena 제거
rules.md #3("코드 분석은 serena를 통해서")과 .ubisam_agent/settings.json 의 serena 플러그인
등록이 이미 제거된 상태여서, 남아 있던 .serena/ 폴더(47MB)를 정리함.
보관 가치가 있던 설정 (폴더 삭제 전 기록)
memories/ 폴더는 없었고 직접 작성한 메모도 없음. project.yml 은 전부 기본값이며
프로젝트 고유 설정은 아래 3개뿐이다. 나중에 Serena를 다시 도입하면 이 값만 넣으면 된다.
project_name: "LGES-OC5-PtoP-Welder"
language_servers:
- csharp # C# 프로젝트이므로
ls_workspace_folders:
- . # 저장소 루트 전체 인덱싱
encoding: utf-8,ignore_all_files_in_gitignore: true등 나머지는 Serena 기본값 그대로였음.project.local.yml은 주석만 있는 빈 파일.cache/csharp/*.pkl(47MB, 2026-06-26 생성)은 재생성 가능한 파생물이라 보관 불필요..serena/는.gitignore:43으로 추적 제외 상태였으므로 삭제해도 git 이력에 영향 없음.
3. Laser Recipe Save 교차 오염 분석 (17:38~17:48)
이 절은 2026-08-04에 소급 기록했다. 당일 산출물은 있으나 일지 누락 상태였음.
증상
Laser Recipe를 Save하면 어쩌다 한 번씩 Active 레시피의 Page·Param이 현재 선택된 레시피에
덮어써진다. 저장 경로 D:\ILSOSConfig\ILSOS_PrismaticRD_PTOP\_config_recipe.
디스크 증거 (확정)
_config_recipe 전수 해시 대조 — U_Frame_Welding 과 U_Frame_Back_Welding 의
TeachingEditor.json·FieldHelper.json 이 바이트 단위 동일(703,563 B, 08-01 19:34:11 / 19:34:36,
25초 간격). backup 판본은 서로 달라 원래는 별개 레시피였다.
근본 원인
저장 대상(경로)과 저장 내용(전역 싱글톤)이 별개이고 둘을 묶는 불변식이 없다.
| 역할 | 실체 |
|---|---|
| 내용 | LASA/GUI/DB/Dao.cs:7 static RecipeWeldingLines WeldingLinesRecipe |
| Page | LASA/GUI/DB/RecipeFieldScan.cs:18-22 Instance |
| 대상 | WeldingCommon/Utils/RecipeHelper.cs:18 static SelectedRecipe |
MainPage.SaveRecipe(fullpath)(MainPage.cs:425-434)는 전역 메모리를 지정 경로에 덤프할 뿐
신원을 확인하지 않는다. 확인 수단(DB.Dao.SystemRecipe.WorkRecipeFile)은 이미 있는데 조회조차 안 한다.
UCScannerObjectTeachingViewModel.OnSaved(id, recipeName)(:202)은 인자를 버리고 static을 쓴다.
살아있는 발생 경로
- 정상 경로의 부분 실패(최유력) —
RecipeHelper.cs:76-78·UCScanner…VM.cs:165-166·:172-173셋 다 대상을 먼저 바꾸고 내용을 나중에 로드(비원자적).ReloadRecipe가 throw 하거나 무예외 무동작(Recipe.cs:64)이면 desync가 남고 다음 Save가 교차 복사. - PLC 전환 시 역방향 오염 —
UCScanner…VM.cs:155-156이 1홉 시점에 저장, 메모리 갱신은 2홉 뒤. - 신규 레시피 생성 시 메모리 미갱신 저장 (
UCScanner…VM.cs:114-115).
반증된 가설 (ptop-developer 적대적 교차검증)
RMSHandlerForPTOP원인설 → REFUTED.RegisterRmsHandler호출은EquipmentSetup.cs:95-973줄뿐이며 전부 주석. 죽은 코드다.- "PLC Word 읽기로 메모리에 Active가 남는다" 인과 → REFUTED.
SeqAutoRunPTOP.cs:346-425는OnActiveReloaded()로 대상·내용을 함께 갱신한다. EquipmentSetup.cs:282RollbackRecipe()주석 해제 → 의미론적 no-op. 백업 필드가 0건이라 되돌릴 원본이 없다.
산출물
docs/분석/2026/08/03/173852_Laser_Recipe_Save_교차오염_분석.md(본문)docs/분석/2026/08/03/173852_Laser_Recipe_Save_교차오염_부록.md(desync 전수표·검증 이력)작업지시서_2026-08-03_Laser_Recipe_Save_교차오염.txt(바탕화면 — 4단계 적용 절차·검증 시나리오)
상태: 소스 미수정. 전 조치가 WeldingComponents/ 하위라 사전 승인 필요 (rules.md #2).