diff --git a/docs/TAG-PORTABLE-48.md b/docs/TAG-PORTABLE-48.md
index 488ba94..2ca91cb 100644
--- a/docs/TAG-PORTABLE-48.md
+++ b/docs/TAG-PORTABLE-48.md
@@ -63,3 +63,45 @@ ETC_로그인_사용자연락처 Return moWrkInfoBiz.UidMst.Item("UidMblPhn").T
ETC_로그인_원내연락처 Return moWrkInfoBiz.UidMst.Item("UIDOFFTEL").ToString
ETC_로그인_사용자ID_사용자명 Return moWrkInfoBiz.UidMst.Item("UidCod").ToString & "." & moWrkInfoBiz.UidMst.Item("UidNam").ToString
```
+
+---
+
+## 진행 상황과 다음 배치
+
+옮긴 것 **23종**. 배치마다 게이트를 통과시키고 커밋한다 —
+한 번에 몰아서 넣으면 어느 태그가 값을 틀리게 내는지 못 가린다.
+
+### 완료 (23)
+
+| 배치 | 종 | 무엇이 필요했나 |
+| --- | --- | --- |
+| 컬럼 직독 | 7 | 없음 |
+| 주민번호 파생 | 4 | DB 복호화(`CRYPTO_AES256`) + 보정 |
+| 형식 가공 | 8 | 없음 |
+| 주소 | 4 | `M_ZipMst` 조회 1회 |
+
+### 다음 배치 (권장 순서)
+
+1. **`OCM_담당의사` 계열 3종** — `GetCodInfDT` + `GetUidMst` 두 조회.
+ 입원/외래로 갈리고 입원은 `ComPrgStt='ILV'` 여부로 한 번 더 갈린다.
+ 조회 둘을 저장소에 만들고 나면 그 뒤 여러 태그가 같은 것을 쓴다.
+2. **문맥만 읽는 나머지 ~25종** — 위 목록에서 1번이 푸는 것을 뺀 나머지.
+3. **기타 55종** — 다른 라이브러리 호출. 하나씩 본문을 봐야 한다.
+4. **자기 SQL 232종** — 여기가 본체다. 건당
+ ① 본문 SQL 을 읽고 ② 바인드로 옮기고 ③ 실DB 로 확인한다.
+ 묶음은 도메인별(처방·검사·간호기록…)로 자르는 것이 낫다 —
+ 같은 표를 쓰는 것끼리 모이면 조회를 공유할 수 있다.
+
+### 옮기지 않을 48종
+
+`MessageBox` 를 띄우는 것들이다. 미리보기는 사람이 응답할 수 없는 자리에서 도므로
+원리상 실행할 수 없다. 값 대신 "대화형이라 미리보기에서 확인할 수 없습니다"라고
+말하게 두는 것이 맞다 — 조용히 비면 서식이 잘못된 줄 안다.
+
+### 배치마다 지킬 것
+
+- 레거시 함수 본문을 읽고 근거를 주석에 남긴다(줄 번호까지).
+- 태그 이름은 `--edit-smoke` 의 이름 검사가 확인한다 —
+ 지어낸 이름 셋이 조용히 앉아 있던 적이 있다.
+- 짐작한 컬럼·계산식은 넣지 않는다. 종이에 그럴듯한 값이 찍히면 아무도 의심하지 않는다.
+- 값이 아니라 사유를 돌려주는 쪽이 항상 안전하다.