# CTX 통합 계획 — 실제 순증은 48종이다 검증 통과 태그를 SheetMe 현행 구현과 대조한 결과(에이전트 6, 73만 토큰). | 상태 | 수 | 뜻 | | --- | --- | --- | | new | **48** | 순증 — 값 생성 코드가 없다 | | already | 13 | 현행이 같은 값을 낸다 — 건드리지 않는다 | | conflict | **6** | 처리하지만 값 규칙이 다르다 — 고쳐야 한다 | | skip | 1 | 죽은 코드 | 즉 통합하면 26종 → 74종이 되고, 그와 별개로 6건을 고쳐야 한다. ## 내가 지난 커밋에 적은 것 하나가 틀렸다 `WORKFLOW-CTX-ROUND1.md` 에 `ETC_로그인_사용자명` 이 `NVL(UidNam,' ')` 때문에 레거시와 갈린다고 적었다. **틀렸다.** `UserContextStore.cs:80` 의 `.Trim()` 이 그 공백을 도로 걷어내서 NULL 케이스는 양쪽 다 `""` 다. 검증이 코드를 직접 읽고 반박했다. 남는 실차이는 다른 것이다 — SheetMe 만 Trim 한다(레거시 16713 은 안 한다). ## conflict 6건 — 고칠 것 | 태그 | 어떻게 다른가 | | --- | --- | | `ETC_로그인_사용자ID_사용자명` | 레거시는 항상 `ID.이름` 결합. SheetMe(`TagPreviewCatalog.cs:197`)는 둘 다 비어 있지 않을 때만 | | `ETC_로그인_사용자ID` | 유효기간 기준일 — 레거시 `GetAdpDtm` 앞 8자, SheetMe `SYSDATE`. 그리고 SheetMe 만 Trim | | `ETC_로그인_사용자명` | SheetMe 만 Trim / 기준일 차이 | | `ETC_로그인_사용자연락처` | 레거시는 유효기간으로 고른 행, SheetMe(`TagPreviewStore.cs:83`)는 `WHERE UIDCOD` 만으로 첫 행 | | `ETC_로그인_원내연락처` | 같은 조회를 공유하므로 같은 결함 | | `ETC_현재년도` | 레거시는 "2026년"(접미 "년"), SheetMe 는 "2026" | `ETC_현재년도` 는 앞선 문서에 없던 네 번째 차이다. 고칠 때 `tests/SheetMe.Core.Tests/TagPreviewCatalogTests.cs:108` 이 "2026" 을 단정하고 있어 그 판정도 함께 바뀌어야 한다 — 검증이 짚어 줬다. ## 통합 순서 1. conflict 6건 수정 + 관련 테스트 갱신 2. new 48종을 배치로 통합(배치마다 `--edit-smoke` 이름 검사 · `--db-patient` · md5) 3. already 13종은 건드리지 않는다 ## 태그별 판정 | 상태 | 태그 | | --- | --- | | already | `ETC_로그인_사용자연락처` | | already | `ETC_로그인_원내연락처` | | already | `ETC_현재시간` | | already | `ETC_현재일시_1_년` | | already | `ETC_현재일시_2_월` | | already | `ETC_현재일시_3_일` | | already | `ETC_현재일시_4_몇시` | | already | `ETC_현재일시_5_몇분` | | already | `ETC_현재일시_MaskBox` | | already | `ETC_현재일시` | | already | `ETC_현재일자_영문` | | already | `ETC_현재일자` | | already | `OCM_수술일자_Refer` | | conflict | `ETC_로그인_사용자ID_사용자명` | | conflict | `ETC_로그인_사용자ID` | | conflict | `ETC_로그인_사용자명` | | conflict | `ETC_로그인_사용자연락처` | | conflict | `ETC_로그인_원내연락처` | | conflict | `ETC_현재년도` | | new | `ETC_로그인사용자_서명` | | new | `OCM_OPNAME` | | new | `OCM_STFDTR` | | new | `OCM_User진료과_Refer` | | new | `OCM_User진료과_한글명칭` | | new | `OCM_User진료과` | | new | `OCM_User진료의사명_Refer` | | new | `OCM_User진료의사명` | | new | `OCM_내원유형` | | new | `OCM_담당의사_Refer` | | new | `OCM_담당의사_영문_Refer` | | new | `OCM_담당의사_영문` | | new | `OCM_담당의사면허번호_Refer` | | new | `OCM_담당의사면허번호` | | new | `OCM_담당의사싸인_Refer` | | new | `OCM_담당의사싸인` | | new | `OCM_담당의사전문의번호_Refer` | | new | `OCM_담당의사전문의번호` | | new | `OCM_로그인_사용자싸인` | | new | `OCM_병동_Refer` | | new | `OCM_병동_병실_베드` | | new | `OCM_병동_병실` | | new | `OCM_병동` | | new | `OCM_병실베드` | | new | `OCM_부상병POA_Refer` | | new | `OCM_부상병POA` | | new | `OCM_부상병명_Refer` | | new | `OCM_부상병코드_Refer` | | new | `OCM_부상병코드` | | new | `OCM_상병명_가로_Refer` | | new | `OCM_상병명_가로` | | new | `OCM_상병명_영어_가로_Refer` | | new | `OCM_상병명_영어_가로` | | new | `OCM_상병명_영어_세로_Refer` | | new | `OCM_상병명_영어_세로` | | new | `OCM_상병코드_가로_Refer` | | new | `OCM_상병코드_가로` | | new | `OCM_상병코드_세로_Refer` | | new | `OCM_상병코드_세로` | | new | `OCM_수술_OprPatETC` | | new | `OCM_수술부위` | | new | `OCM_수술상병` | | new | `OCM_수술주상병` | | new | `OCM_심사_부상병명` | | new | `OCM_심사_부상병코드` | | new | `OCM_심사_주상병명` | | new | `OCM_심사_주상병코드` | | new | `OCM_외래내원일시_Refer` | | skip | `ETC_건강보험증번호_Refer` |