Ubisam-MergeTool/doc/진행상황.md
ksj09406 a86dc1596f 12차 G-2 - base 칸으로 머지하는 단축키 (사용자 요청)
12차 B-1 로 왼쪽 파일로 반영하는 길([<] · TakeLineToBase)이 생겼는데 단축키가
없었다. 덩어리를 왼쪽으로 보내는 것은 명령 자체가 없었다 - AcceptBlock
(Alt+Shift+Right)은 오른쪽으로만 간다.

키를 어디에 둘지

사용자가 "Alt+Left 도 비어 있지 않냐" 고 물었다. 비어 있지 않았다 -
CopyRightToLeft 가 쓰고 있었는데, 2-Way 에서 그것이 하는 일은 이름·화살표와
달리 "이 줄 되돌리기" 였다. 그런데 이름이 가리키는 "왼쪽으로 반영" 이 B-1 로
실제로 생겼다. 그래서 감각이 맞는 쪽으로 넘겼다(사용자 결정).

  Alt+Right        한 줄 오른쪽으로        그대로
  Alt+Shift+Right  덩어리 오른쪽으로       그대로
  Alt+Left         이 줄 되돌리기      ->  한 줄 왼쪽 파일로
  Alt+Shift+Left   (없음)              ->  덩어리 왼쪽 파일로 (새로 만듦)
  이 줄 되돌리기   Alt+Left            ->  단축키 없음, Ctrl+Z 만

Alt+Right 가 이미 2-Way/3-Way 로 갈라져 있으므로 Alt+Left 도 같은 식으로
갈랐다. 3-Way(Take Theirs)는 안 건드렸다.

만든 것
- AcceptBlockToBase · ApplyGroupToBase - AcceptBlock/ApplyGroup 의 거울.
  주석은 덩어리 첫 줄 위 한 줄, 되돌리기는 한 번에(11차 F-2 와 같은 규칙).
  덩어리를 잡는 BlockAround 는 2-Way 에서 이미 CanTakeBase 로 잡으므로
  그대로 썼다 - 가져올 수 있는 줄과 보낼 수 있는 줄이 같은 줄이고 방향만 반대다.
- [이 덩어리 왼쪽으로] 단추 - [이 덩어리 반영] 옆에. 두 파일 비교에서만 뜬다.
  단축키만 두면 찾을 길이 없다.

겪은 것
- RaiseCanExecuteChanged 와 OnCaretRowChanged 에 새 명령을 안 넣어 단추가
  꺼진 채였다. CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는다.
- 덩어리 명령은 고른 줄이 아니라 CaretRow(편집기 캐럿)를 본다. 시험이 목록을
  고르기만 해서 한 줄만 갔다 - Alt+Down 으로 캐럿을 놓아야 했다.

확인
- 화면 g2-verify 21건 실패 0 (연속 세 줄이 다른 재료를 따로 만들어 씀)
  Alt+Left 는 한 줄만, Ctrl+Z 로 되돌아가고, 덩어리는 셋이 한 번에 가고
  한 번에 돌아온다
- 하네스 ShortcutTest 88 -> 101건 (키 겹침 없음, 화살표 넷의 모양이 맞음,
  충돌 이동을 안 빼앗음, Alt+Left 설명이 "되돌리기" 라고 거짓말하지 않음)
- 회귀 g1 · e2 · e3 · e4 실패 0, 빌드 경고 0 · 오류 0

값으로 확정하지 못한 것: Alt+Shift 조합을 흉내 낸 키로는 못 눌렀다. 윈도우가
입력 언어 전환으로 먼저 채간다 - SendKeys 로는 아예 안 닿고 keybd_event 로는
Shift 가 빠져 Alt+Left 처럼 동작했다. 기존 Alt+Shift+Right 로 견줘 봐도 같아
시험 도구 한계다(C-3 의 DragMove 와 같은 부류). 그래서 덩어리는 같은 명령을
부르는 단추로 확인했다. 사람 손으로 한 번 눌러 보는 것이 남았다.

Agent: main (claude-opus-5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-30 13:04:49 +09:00

50 KiB
Raw Blame History

MergeHub 진행 상황

지금 무엇이 남았는지만 적는다. 끝난 것의 상세는 history/ 로 옮겼다.

항목을 끝내면 이렇게 한다.

  1. 상세는 history/YYYY-MM-DD-주제.md 에 적는다.
  2. 이 파일은 대기 → 완료로 상태만 고친다.
  3. history/changelog.md 에 한 줄을 더한다 (날짜 · 무엇을 왜 · 커밋).

푸시는 하지 않는다 — 사내 Gitea 저장소가 만들어지면 그때 한 번에 올린다. 상태 표기: 대기 · 진행 · 완료


4차 — 로컬 머지툴 사용성 (2026-09-10) — 전부 끝

진행 기록: history/2026-09-10-4차.md 지시서: 작업지시/4차.md. 기능을 늘리는 것이 아니라 매일 쓰는 사람의 걸림돌을 없애는 것이 목적이다.

A. 작업한 것이 사라지는 문제

상태 항목
완료 A-1 저장하지 않은 편집이 말없이 사라진다
완료 A-2 내보낸 보고서에 만든 사람이 없다

B. 매일 쓰는 마찰 줄이기

상태 항목
완료 B-1 최근 비교 목록
취소 B-2 같은 줄 접기 (2026-09-10 사용자 판단으로 뺌)
완료 B-3 폴더 비교에서 다음 다른 파일로
취소 B-4 외부 편집기로 열기 (2026-09-10 사용자 판단으로 뺌)

C. 화면 구성 정리

상태 항목
완료 C-1 같은 경로가 세 군데 나온다
완료 C-2 아래쪽 정보가 세 군데로 흩어져 있다
완료 C-3 Git 탭의 원격 블록을 접는다
완료 C-4 색 구분 범례를 이동 도구로
완료 C-5 ACTIONS 칸을 자주 쓰는 것과 한 번 정하는 것으로 나눈다

D. 변경 이력을 전용 폴더로

상태 항목
완료 D-1 doc/history/ 를 만들고 진행상황을 나눈다
완료 D-2 앞으로의 기록 규칙을 정한다

5차 — 실제 소스에 맞추기 (2026-09-10 ~)

진행 기록: history/2026-09-11-5차.md 지시서: 작업지시/5차.md. 지금까지는 시험용 파일로만 확인했다. 5차는 실제 소스(2,115개 · 426,723줄)를 한 번 재 보고 나온 것들이다. 2026-09-11 부터는 실제 소스를 더 보지 않는다 - 여기는 머지툴을 만드는 자리이고, 시험 재료는 우리가 만들어 쓴다. 이미 받아 둔 숫자는 그대로 쓴다.

A. 남의 소스를 망가뜨릴 수 있는 것

상태 항목
완료 A-1 CP949 파일 67개를 잘못 읽으면 한글이 깨진다
완료 A-2 커밋·체크아웃 뒤에 저장 안 한 편집이 조용히 사라진다

B. 실제 소스에 맞추기

상태 항목
완료 B-1 XAML 색칠이 사실상 없다 (400개 · 42,477줄)
완료 B-2 폴더 비교가 오래 걸린다 — 전체 비교 3.4배 · 빠른 비교 4.7배

C. 실전 투입

상태 항목
완료 C-1 병합을 한 번 끝까지 해 본다 — 커밋까지 갔다. 걸린 것 23가지(심각 5)가 6차 재료

6차 — 병합을 끝까지 믿고 쓸 수 있게 (2026-09-14 ~)

진행 기록: history/2026-09-14-6차.md 지시서: 작업지시/6차.md. 5차 C-1 에서 만든 저장소로 병합을 끝까지 해 보고 걸린 23가지다. 확인은 같은 저장소(C1Repo)로 한다. 실제 소스는 열지 않는다.

A. 파일이나 이력을 망가뜨리는 것

상태 항목
완료 A-1 3분할로 푼 파일을 저장하면 CRLF 가 LF 로 바뀐다 — 내 쪽(ours) 파일의 줄끝·인코딩을 따른다
완료 A-2 Save & Commit 이 "실패" 라는데 파일은 이미 써지고 스테이징됐다 — [해결로 저장] 을 따로 둠
완료 A-3 충돌 파일을 고르면 상대(Theirs) 칸이 안 나온다 — 콤보를 안 건드려도 네 칸, REMOTE 제목에 상대 브랜치
완료 A-4 상대가 지운 파일을 3분할이 다룰 줄 모른다 — 남은 파일을 두 칸으로, [파일 남기기] · [파일 지우기] 띠
완료 A-5 양쪽 새 파일에 Accept Both 를 누르면 빌드가 깨진다 — 누르기 전에 묻고, 글로 이어 붙여 BOM 한 번 · 줄끝 한 가지

B. 헷갈리거나 막히는 것

상태 항목
완료 B-1 충돌 목록에서 3분할 화면까지 가는 길이 끊겨 있다 — 병합 뒤 목록이 바로 서고, 두 번 누르기·Enter·[3분할로 열기]
완료 B-2 확인 창이 엉뚱한 파일 이름을 댄다 — 이름·[저장하고 계속] 모두 실린 파일 기준, [취소] 뒤 콤보도 돌아온다
완료 B-3 커밋 메시지가 엉뚱하게 남는다 — 기본값 Merge branch '상대' into 내 브랜치, # 줄 뺌, 병합이 끝나면 칸을 비움
완료 B-4 MERGED 칸 줄 번호가 네 자리에서 잘린다 — 네 칸 여백을 66px 로, MERGED 번호 자리 20 → 36px(다섯 자리)
완료 B-4 확인 중 발견 두 건 — 멀리 건너뛰면 네 칸이 위로 밀려 아래가 빔 · git mergetool 세 벌이 두 칸으로 열림
완료 B-5 머지 주석은 소스에 넣고, 병합 뒤에는 그 줄을 무시한다 — 비교(두 칸 · 네 칸 · 폴더)에서 가리고, 주석만 다른 git 충돌은 양쪽 주석을 남겨 자동으로 푼다. 설정에서 끔
완료 B-6 충돌 탭에서 하나씩 누를 때마다 오래 기다린다 — 여러 개 골라 Accept 한 번, 다시 읽기는 끝에 한 번. 15개 22.0초 → 1.2초
완료 B-7 상태바가 병합 중에 믿을 수 없는 값을 보인다 — 인코딩 · 줄바꿈을 내 쪽(ours) 파일로, 요약에 "남은 충돌 N개 · 받을 변경 M줄"
완료 B-8 병합 커밋 뒤 파일 비교 탭이 어정쩡하게 남는다 — 다시 나지 않음(두 흐름 확인, B-1 · A-3 에서 없어짐). 코드 변경 없음

E. 추가 요청 (2026-09-14)

상태 항목
완료 E-1 C# 코드 스타일 맞춤 (AURORA · Allman) — 비교 전에 중괄호 줄바꿈을 맞춤. 두 칸 · 네 칸 · 폴더 비교, 설정. 스타일만 다른 파일 남은 차이 39줄 → 1줄
완료 E-2 발표 시연 재료 demo\ — make-demo.ps1 한 번으로 폴더 비교 · 스타일 · mergetool · 큰 파일 · 병합 저장소
완료 E-3 웹 문서 — 사용자 매뉴얼 · 발표 자료 · 남은 일 · 개발 현황 · 기획안 최신화 · 시연 대본 · WinMerge 비교

C. 사소한 것

상태 항목
완료 C-1 로그와 목록 다듬기 — 결과 로그 한 번, 목록에 충돌 종류 네 가지, "남은 충돌 N개 · 푼 것 M개 (M/전체)". CP949 로그 이름은 이미 고쳐져 있었음

D. 확인

상태 항목
완료 D-1 병합을 처음부터 다시 끝까지 해 본다 — 충돌 26(자동 2)을 MergeHub 만으로 풀어 병합 커밋. 줄끝 · BOM 이 바뀐 파일 0/33, A 다섯 가지 다시 안 남. 23가지 중 사라짐 18 · 정해서 남음 1(머지 주석)

6차 전부 끝. D-1 에서 새로 걸린 세 가지는 7차 재료다(고치지 않음).

  • N1 3분할에서 고른 줄 로그가 "N행 (3-Way 안 씀) 반영"
  • N2 마지막 [Save](옛 이름 해결로 저장) 뒤 병합 중인데 두 칸 · "남은 차이 3줄" 로 떨어짐
  • N3 병합 커밋 뒤 .git/MERGEHUB_CONFLICTS 가 남음

7차 — 병합 화면이 사실대로 말하게 · 병합 말고 다른 충돌 길 (2026-09-14 ~)

진행 기록: history/2026-09-14-7차.md 지시서: 작업지시/7차.md. 6차 D-1 에서 새로 걸린 세 가지와, 6차에서 뺀 pull · rebase · cherry-pick 충돌.

A. 병합 화면이 사실과 다르게 말하는 것

상태 항목
완료 A-1 마지막 충돌을 저장하면 "남은 차이" 가 뜬다 — 병합 중 충돌 0 이면 "충돌 정리 끝 · 병합 커밋을 할 수 있습니다 · 내 쪽 대비 받은 변경 N줄", 제목에 "병합 전 내 쪽"
완료 A-2 3분할에서 줄을 골라도 로그는 "3-Way 안 씀" 이라고 한다 — 로그 "10행 Theirs(feature/theirs) 반영" · "Mine(feature/mine) 으로 정함", 충돌 네 칸 머리는 콤보 대신 "병합 충돌 · REMOTE = 상대"

B. 치우기

상태 항목
완료 B-1 병합 커밋 뒤에도 .git/MERGEHUB_CONFLICTS 가 남는다 — 병합 커밋 · 작업 취소 직후와 새로고침마다 쓸모없어진 목록을 지움(터미널에서 끝낸 병합 포함). 병합 중에는 그대로

C. 병합 말고 다른 충돌 길

상태 항목
완료 C-1 pull 이 낸 충돌에는 머지 주석 자동 풀기가 안 걸린다 — pull 도 [Merge] 와 같은 뒷일(주석 자동 풀기 · 알림 · 진행 줄), 커밋 메시지 "Merge remote-tracking branch 'origin/…' into …"
완료 C-2 rebase · cherry-pick 충돌을 네 칸으로 끝까지 — 작업별 칸 제목(올릴 자리 · 다시 올리는 내 커밋 · 가져오는 커밋) · 진행 표시 · 끝내기 단추(병합 커밋 · 계속 · 커밋) · 원래 메시지, 이력 [모든 브랜치]. 두 길 모두 줄끝 바뀐 파일 0

D. 확인

상태 항목
완료 D-1 네 길(병합 · pull · rebase · cherry-pick)을 처음부터 다시 끝까지 — 모두 MergeHub 만으로 커밋(rebase 끝)까지, 줄끝 · BOM 바뀐 파일 0. A-2 · B-1 다시 안 남, A-1 은 rebase · cherry-pick 에서 다시 남. MERGED 줄 번호 안 잘림. 새로 걸린 넷(N1 고른 파일 대신 다른 파일 내용이 저장됨 · N2 · N3 · N4)은 8차 재료(고치지 않음)

E. 추가 요청

상태 항목
완료 E-1 [해결로 저장] 이름을 [Save] 로 — 하는 일은 그대로, 알림 · 안내 · 웹 문서 이름도
완료 E-2 폴더 비교 탭에 폴더를 하나씩 끌어다 놓으면 첫 칸 → 둘째 칸 차례로 (경로 칸 위가 아니어도) — 양쪽이 차면 바로 비교, 칸 위에 놓은 것도 차례에 침
완료 E-3 사용자 이름을 저장하기 전에는 화면을 쓸 수 없게 — 이름 창이 끌어도 안 움직이고 저장 없이 닫히지 않음(플랫폼, 배포함)
완료 E-4 창 크기를 마음대로 조절할 수 있게 — 끌어 크기 조절(최소 1280×720) · 두 번 누르기 최대화 ↔ 복원 · 화면 이동이 크기를 지킴 · 크기 · 모니터 기억. 최대화는 작업 표시줄까지 덮고(사용자 결정) 크기를 바꿀 때 깜빡이지 않음(검은 칠 99.7% → 3%). 플랫폼, 배포함. MergeHub 네 탭 최소 크기에서 안 잘림

7차 전부 끝. D-1 에서 새로 걸린 넷은 8차 재료다(고치지 않음). 웹 문서 갱신도 8차로 넘겼다.

  • N1 파일 비교 탭을 처음 여는 것이 [3분할로 열기] 면 첫 충돌 파일이 보이고, 그 화면을 [Save] 하면 고른 파일에 그 내용이 써짐
  • N2 rebase · cherry-pick 마지막 [Save] 뒤 "남은 차이 3줄"(A-1 은 병합만)
  • N3 MERGED 칸 번호가 결과 파일 번호가 아님(3363 · 상태바 3366)
  • N4 바뀌는 것 없는 cherry-pick 에서 [커밋] 이 켜지고 누르면 실패

8차 — 고른 파일에 고른 내용을 · 작업마다 화면이 사실대로 (2026-09-15 ~)

진행 기록: history/2026-09-16-8차.md 지시서: 작업지시/8차.md. 7차 D-1 에서 새로 걸린 넷과 7차에서 남긴 것(revert · 원래 작성자 · 창 크기의 안 본 곳) · 웹 문서.

A. 사용자의 파일을 망가뜨리는 것

상태 항목
완료 A-1 고른 충돌 파일 대신 다른 파일이 보이고, 그 화면을 저장하면 고른 파일에 써진다 — 늦게 끝난 읽기를 버리고 다시 읽음, 화면에 실린 파일과 저장할 파일이 다르면 쓰지 않음. 네 길 모두 고른 파일이 열리고 저장이 그 파일에만 감

B. 작업마다 화면이 사실대로 말하게

상태 항목
완료 B-1 rebase · cherry-pick 에서 마지막 저장 뒤 "남은 차이" 가 뜬다 — 요약 · BASE 제목이 작업(병합 · rebase · cherry-pick · revert)을 따른다. rebase 는 "충돌 정리 끝 · [계속] 으로 rebase 를 이어 갑니다 · 올릴 자리 대비 올린 변경 N줄" · 제목 "올릴 자리". 병합 글은 그대로
완료 B-2 바뀌는 것 없는 cherry-pick 에서 [커밋] 이 켜지고 누르면 실패한다 — 커밋할 것이 없으면 [커밋] 이 꺼지고 진행 줄 · 로그가 "가져올 변경이 없습니다 - [작업 취소] 로 끝냅니다". 병합 커밋은 그대로(트리가 같아도 정상). --allow-empty 는 사용자와 정한 뒤
완료 B-3 MERGED 칸 줄 번호가 결과 파일 번호가 아니다 — 사용자가 "결과 파일 번호로" 를 고름(2026-09-16). 결과에 들어가는 줄만 1부터 다시 매긴다. 끝 번호 3363 → 3369 로 상태바 · [이동] 칸 · 저장된 파일(3369줄)과 같아짐

C. 7차에서 남긴 것

상태 항목
완료 C-1 revert 충돌을 화면으로 끝까지 — 생성기에 feature/revert 갈래를 더해 충돌 16개를 만들고, MergeHub 만으로 [Revert] → 네 칸("되돌리는 커밋 …") → [커밋] 까지. 원래 메시지 Revert "내 쪽 작업", 줄끝 · BOM 바뀐 파일 0, 제품 코드 변경 없음
완료 C-2 cherry-pick 이 원래 작성자를 남기는지 눈으로 — 생성기에서 상대 쪽 커밋만 작성자를 박지훈으로 두고 확인. MergeHub cherry-pick 은 작성자 박지훈 · 커밋한 사람 시험, revert 는 둘 다 시험 — git 과 같음. 제품 코드 변경 없음
완료 C-3 창 크기 조절에서 안 본 것 — 실제 픽셀로 재고 사용자와 정함. 첫 Win+↓ 를 두 번 누르기 복원과 같게(작업 영역 80% · 가운데, 화면 밖 16px 없어짐), 덮는 창을 창 가운데로(최대화에서 36px 어긋남 → 0). 스냅은 최소 크기 때문에 반쪽이 안 됨(적어 둠), 1px 테두리는 그대로. 플랫폼, 배포함

D. 문서

상태 항목
완료 D-1 웹 문서를 7차 · 8차에 맞게 — 매뉴얼(창 크기 · 폴더 끌어놓기 차례 · 작업별 네 칸 제목 · MERGED 번호 · 다른 충돌 길) · "알아 둘 한계" 다시 씀 · 남은 일 표 · 숫자(22벌 1,073건 · 커밋 94). 아티팩트 버전 7 로 발행

E. 확인

상태 항목
완료 E-1 다섯 길(병합 · pull · rebase · cherry-pick · revert)을 사람 순서 그대로 다시 끝까지 — 파일 비교 탭을 미리 열지 않고 모두 MergeHub 만으로 커밋(rebase 끝)까지. 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 검사 0. 7차 A-1 · A-2 · B-1 · 8차 A-1 · B-1 · B-2 다시 안 남, F-1 본문 26개. 새로 걸린 것 N1(cherry-pick 요약의 "내 쪽 대비" 가 틀린 기준)은 9차 재료(고치지 않음)

F. 추가 요청

상태 항목
완료 F-1 병합 커밋 메시지 본문에 충돌 해결 내역을 자동으로 적기 (2026-09-17 사용자 요청) — 병합 · pull 중 푼 방법(줄 단위 · Accept Mine/Theirs/Both · 남기기 · 지우기 · 머지 주석 자동)을 .git 에 적고 [병합 커밋] 본문에 "충돌 해결 N개 · 이름" + 파일 목록. 메시지 칸에 미리 보임, 커밋 · 취소 때 기록 치움. 스타일 맞춤 선택지는 만들지 않기로

8차 전부 끝. E-1 에서 새로 걸린 것은 9차 재료다(고치지 않음).

  • N1 cherry-pick 마지막 [Save] 뒤 두 칸의 BASE 는 이력에서 고른 커밋인데 요약이 "내 쪽 대비 가져온 변경 N줄" 이라고 한다. 한 번은 다른 브랜치 커밋(f310f49)이 기준으로 잡혔다(다시 재니 안 남)

9차 — 두 칸이 무엇과 견주는지 사실대로 · 8차에서 남긴 것 (2026-09-17 ~)

진행 기록: history/2026-09-17-9차.md 지시서: 작업지시/9차.md. 8차 E-1 에서 새로 걸린 N1(cherry-pick 요약의 기준)과 그 곁가지 · 전에 남겨 둔 작은 것 둘 · 웹 문서.

A. 두 칸이 무엇과 견주는지 사실대로

상태 항목
완료 A-1 cherry-pick 마지막 저장 뒤 "내 쪽 대비" 라고 하지만 실제 기준은 이력에서 고른 커밋이다 — 사용자가 "HEAD 로 옮긴다" 를 고름(2026-09-17). 새로고침이 고른 커밋을 놓치면 목록 맨 위(모든 브랜치에서는 다른 브랜치 커밋)로 채우던 것을 해시로 되찾고 없으면 HEAD, 작업 중 충돌이 막 0 이 되면 HEAD 로. 요약은 기준이 HEAD 일 때만 작업 글. cherry-pick · revert 마지막 Save 뒤 제목 · 요약 · 기준이 같음(6줄 = git 대조)
완료 A-2 한 번은 기준이 다른 브랜치 커밋이었다 — 원인은 A-1 과 같음(선택을 놓치면 목록 맨 위로 채움). 해시만 지키자 cherry-pick [커밋] 뒤 옛 HEAD 에 남아 "남은 차이 6줄" 이 떠서, HEAD 를 보고 있었으면 새 HEAD 를 따라가게 함께 고침. 8차 E-1 순서 여섯 번 모두 시작 · 파일 단위 = 고른 커밋, Save 뒤 = HEAD, 커밋 뒤 = 새 HEAD

B. 전에 남겨 둔 작은 것

상태 항목
완료 B-1 MERGED 칸에서 넣은 주석 줄이 다시 정렬하면 "무시" 색이 된다 — 사용자가 "처음부터 무시 색" 을 고름(2026-09-17). 넣는 순간 "추가"(파랑)였고 LOCAL(Mine) 칸에 주석 글이 보였는데, 다시 정렬했을 때와 같은 모양(무시 · Mine 빈 자리)으로 넣는다. Undo · Redo · 저장 내용 그대로, 규칙을 끄면 지금처럼 추가. 규칙을 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 가는 것은 적어 둠
완료 B-2 폴더 비교 뒤 화면 트리를 세우는 데 1초 남짓 — 고치지 않음. 앱 안에서 단계를 나눠 재니 트리 만들기 5~17ms · 첫 화면까지 0.13초(필터 전체 0.24초)이고 기다림의 대부분은 비교(데운 뒤 0.7초). 5차의 "1초" 는 자동 조작 대기가 섞인 값. 그날 첫 비교는 9.2초(디스크 첫 읽기로 보임)를 적어 둠

C. 문서

상태 항목
완료 C-1 웹 문서를 8차 끝 · 9차에 맞게 — 개요 숫자(22벌 1,122건 · 커밋 104 · 8차 끝 · 9차 진행), 매뉴얼에 병합 커밋 본문 · 해결 기록이 남는 곳 · 마지막 저장 뒤 기준 HEAD · 알아 둘 한계 넷 더함, 남은 일에 8차 D-1 · F-1 · E-1 · 9차 표 · 정해서 두지 않는 것, 지금까지 만든 것 7~9차. 화면 문구 grep 대조 · 태그 짝 맞음. 아티팩트 버전 9

D. 확인

상태 항목
완료 D-1 cherry-pick · revert 를 마지막 파일까지 네 칸으로 끝까지 (+ 병합 · rebase 회귀) — 네 길 모두 MergeHub 만으로 끝까지(cherry-pick · revert 는 [모든 브랜치] 켬). 마지막 Save 뒤 제목 · 요약 · 기준(HEAD)이 같고 요약 N줄 = git diff, 커밋 뒤 기준 새 HEAD. 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 검사 0 · 병합 본문 26개 · 빈 cherry-pick [커밋] 꺼짐. 새로 걸린 것 N1(cherry-pick 첫 회차에서 고르기 한 번이 안 남아 멈춤, 다시 하니 끝까지)은 적어 둠

9차 전부 끝. D-1 에서 새로 걸린 것은 10차 재료다(고치지 않음).

  • N1 cherry-pick 첫 회차에서 Motion/Unit0.cs 충돌 6개를 고른 뒤 "남은 충돌 1개" 로 남아 [Save] 가 꺼짐. 고르기 한 번이 로그에 안 남음(10줄 · 다른 길 18줄). 새 저장소로 다시 하니 끝까지 — 자동 조작 쪽으로 보이나 원인 미확인

10차 — 두 탭이 같은 커밋을 보게 · 남은 표시 어긋남 · 누름을 놓치는지 (2026-09-17 ~)

진행 기록: history/2026-09-17-10차.md 지시서: 작업지시/10차.md. 9차 D-1 에서 새로 걸린 N1 과 9차에서 적어 둔 셋(두 탭 고른 커밋 · 규칙 끈 채 반영 색 · 첫 폴더 비교 9.2초) · 다섯 길(+ pull) · 웹 문서.

A. 한 번 누른 것이 남지 않는다

상태 항목
완료 A-1 네 칸에서 충돌을 차례로 고르는데 한 번이 남지 않아 "남은 충돌 1개" 로 멈췄다 — 고치지 않음. 앱에 임시 로그를 넣고 61회(누름 366번, 9차 간격 31회 · 0.1초 30회, 병합 · cherry-pick) 되풀이 — 다시 안 남. 앱은 Take 를 모두 충돌 줄에서 받아 하나씩 줄임(헛돈 0). Take 뒤 [다음 충돌] 처리 전에는 Take 단추가 꺼져 있고, 9차 시험 도구가 "꺼져서 안 누름" 을 버린 것으로 보임 → 시험 도구가 다시 누르고 못 누르면 적게 고침

B. 두 탭이 같은 커밋을 보게

상태 항목
완료 B-1 Git 탭 이력에서 고른 커밋을 파일 비교 탭이 새로고침 전까지 따라오지 않는다 — 사용자가 "바로 따라간다 · 편집 있으면 고르는 순간 묻는다" 를 고름. 반대 방향(파일 비교 탭에서 고름)은 Git 탭 선택 표시가 남아 [Revert] 가 보이지 않는 커밋에 걸렸다. 양쪽이 고른 것을 알리고 다른 쪽이 따라감(파일 비교는 게이트가 빈 뒤 다시 세움, Git 탭 커밋 내용은 다시 보일 때). 목록이 선택을 바꾸기 전에 묻고 [취소] 면 누름을 막음. 마우스 · 방향키 · [취소] · [계속] · [Revert] 대상 확인

C. 남은 표시 어긋남

상태 항목
완료 C-1 "머지 주석 무시" 를 끈 채 다시 정렬하면 반영 색이 옆 줄로 옮겨 간다 — 네 칸은 규칙과 상관없이 주석 줄과 코드 줄을 떼어 놓고, 다시 정렬한 주석 줄을 "반영함" 으로 칠하지 않음. 규칙 끔 넣은 직후 = 다시 정렬 뒤(반영함 6 · 추가 6), 요약 · 줄 수 · 저장 해시 그대로. 두 칸도 떼어 보니 차이 수가 4 → 5줄로 늘어 두 칸은 그대로 둠

D. 처음 한 번이 느리다

상태 항목
완료 D-1 그날 첫 큰 폴더 비교가 9.2초 — 고치지 않음. 파일마다 버퍼 없이 열어 캐시를 비운 뒤 재도(한 갈래 읽기 0.4 → 1.8초로 먹는 것 확인) 전체 비교 0.46~0.54초로 데운 상태(0.48초)와 같음 — 여러 갈래로 읽어서. 앱 새로 켠 첫 비교도 느리지 않음. 9.2초는 다시 안 남(디스크 정보 캐시 · 백신 짐작, 재부팅 · 보안 설정 없이 못 만듦). 매뉴얼 한계 문장을 잰 값으로. HDD 는 재 보지 않음

E. 확인 · 문서

상태 항목
완료 E-1 다섯 길(+ pull)을 다시 끝까지 — 고치지 않음. 병합 · pull · rebase · cherry-pick · revert 모두 첫 회차에 끝까지. 누른 Take = 줄 고른 로그(18 · 18 · 18 · 18 · 6), 마지막 Save 뒤 제목 · 요약 · 기준 = git, 줄끝 · BOM 바뀐 파일 · 충돌 표식 · class 이름 0. Git 탭에서 고른 커밋을 파일 비교 탭이 바로 따라옴(다섯 길). 8차 A-1 · B-1 · B-2 · F-1 · 9차 A-1 · A-2 · B-1 안 남. 새로 걸린 것 없음
완료 E-2 웹 문서를 10차에 맞게 — 발행본(버전 10)이 9차 D-1 파일과 같음을 확인하고 고침. 개요 숫자(1,147건 · 커밋 114 · 10차 끝) · 매뉴얼 "두 탭은 같은 커밋을 본다" · 알아 둘 한계에서 고친 둘(B-1 · C-1) 뺌 · 남은 일에 10차 표와 남은 것(HDD) · 지금까지 만든 것 10차 · 기획안 v2 일정 · WinMerge 숫자. 화면 문구 grep 대조 · 태그 짝 맞음 · 아티팩트 버전 11

F. 추가 요청

상태 항목
완료 F-1 · F-2 폴더 비교 "같은 것만" 에 내용이 다른 것처럼 보이는 줄이 섞인다 (2026-09-17 사용자) — 폴더 줄이 폴더 자신의 "다름"(주황)으로 보이던 것을 걸러 본 갈래의 개수("같음 122개")로. 설정(스타일 맞춤 · 머지 주석 무시)으로 같음이 된 파일은 사용자 결정대로 "같음(스타일만 다름)" · "같음(머지 주석만 다름)" 으로 따로 표시. 요약 수 그대로
완료 F-3 "주석만 다름" 이름을 바꾼다 (2026-09-17 사용자) — BOM · 줄끝 · 인코딩 · 공백만 달라도 들어오던 상태를 "다름(코드는 같음)" 으로. 요약 "다름 N(코드는 같음 M)" · 범례 · 보고서 · 웹 문서. 판정 · 수 그대로

10차 전부 끝. E-1 에서 새로 걸린 것은 없다. 11차는 기획안 v1.2 에서 "일부" 로 남은 것(변경분 추출 · 커밋 메시지 수정)과 사내 베타 전 확인에서 나왔다.

  • 같은 날 기획안 문서(잠금)도 v1.2 로 고쳐 올림 — 제품 코드 아님

11차 — 변경분 추출을 믿고 들고 가게 · 베타 전에 깨지는 것 · 커밋 메시지 수정 (2026-09-17 ~)

진행 기록: history/2026-09-18-11차.md 지시서: 작업지시/11차.md. 코드를 읽고 적은 짐작이라 항목마다 먼저 다시 내고 시작한다.

A. 변경분 추출을 믿고 들고 가게

상태 항목
완료 A-1 먼저 뽑아 보고 적는다 — 고치지 않음. 아홉 경우를 화면에서 뽑아 git 과 대조: 파일 고르기 · 바이트 보존(이진 · 한글 · 깊은 경로) · 범위 표시는 맞음. 확정된 문제 넷 — 지운 파일 · 이름 바뀐 옛 경로가 안 남음, 무엇과 무엇 사이인지 안 남음(병합은 첫 부모 · 거꾸로 범위도 말없이), 비어 있지 않은 폴더에 묻지 않고 덮어써 옛 파일이 섞임, 쓰다 막히면 반쯤 뽑힌 채 멈춤
완료 A-2 뽑은 폴더 옆에 안내 파일(…_변경분안내.txt) — 사용자 결정대로 폴더 밖에 두고 지울 파일은 목록으로만. 범위(커밋 제목 · 날짜) · 뽑은 파일(추가 · 수정 · 이름 바뀜은 옛 이름) · 장비에서 지워야 할 파일(지워짐 · 옛 경로). 화면에서 뽑아 git 과 대조 · 하네스 ReportTest +14(45건)
완료 A-3 고른 폴더 아래 새 폴더(변경분_4eb9ece..cbcad8a_2026-09-18, 같은 이름이면 _2)를 만들어 뽑는다 · 뽑기 전에 쓸 수 있는지 먼저 보고 하나라도 막히면 아무것도 쓰지 않는다(사용자 결정). 화면에서 두 번 뽑아 기존 파일이 섞이지 않는 것 확인 · 하네스 ReportTest +12(57건)
완료 A-4 ZIP 으로 뽑기 — 사용자 결정 "폴더에 더해 ZIP 도". 폴더 옆 같은 이름 .zip(폴더 · 안내 파일 나란히, 바이트 그대로, 한글 이름 UTF-8 표시). 아홉 경우 다시 — ZIP 8/8 을 tar 로 풀어 폴더와 경로 · 해시 같음. 하네스 ReportTest +13(70건)

B. 사내 베타 전에 깨지는 것

상태 항목
완료 B-1 배포 묶음 — 옛 Release(09-07)는 본 탭 3개 · 지금 형식 142개 중 74개가 없었다. Release 다시 빌드(경고 0 · 오류 0) · 참조를 따라가 65개 97MB → 41개 43.5MB(안 닿는 dll 7개 · 맥/리눅스/ARM 용 · pdb · 빈 Lang 뺌, 플랫폼 Core 가 참조하는 차트 몫은 사용자 결정대로 남김) · scripts\make-bundle.ps1 이 묶음과 배포묶음.txt(파일 · 크기 · 까닭) 를 만든다 · 빈 폴더(%TEMP%\mergehub-beta)에서 켜 네 탭 · 병합 한 길 끝까지(647f1f8, 줄끝 · BOM 바뀐 파일 0) · 매뉴얼 실행 위치 문장 고침
완료 B-2 D 드라이브가 없는 PC · 설정 없는 첫 실행 — 첫 실행은 오류 없이 되고 기본값이 매뉴얼 표와 같다. D 를 못 쓰면 UiSettingsService.cs:86 에서 실패해 "계속 쓸 수 있습니다" 창 뒤 창 없는 프로세스가 남는 것을 같은 줄에서 재현. 플랫폼에서 고침(377ffd3, 사용자 결정): D 를 못 쓰면 %LOCALAPPDATA%\UbisamConfig · 켜는 중 실패는 "켜지 못했습니다" 뒤 끝냄. 세 경우 화면 확인 · 플랫폼 하네스 24건 · 사용자 확인 뒤 플랫폼 배포(바뀐 것 Core · Shell · README 셋) · 배포 묶음 다시 만듦 · 시험 흔적 지움

C. 커밋 메시지 수정

상태 항목
완료 C-1 있는 [커밋 수정] 바로잡기 — 여덟 가지를 화면에서 재현한 뒤 1 · 3 · 4 · 7 고침([마지막 메시지]가 HEAD 것 · 작성자와 작성 시각 보존 · 작업 중 단추 끔 · 알림에 "옛 → 새 해시 · 파일 N개 포함"), 이어서 2 · 6 은 "먼저 묻기"(사용자 결정) — 스테이징해 둔 파일이 있거나 이미 올린 커밋이면 확인 창을 띄우고 [아니오] 면 아무것도 안 바뀐다. 하네스 MergeSaveTest +22(232건). 8(여러 줄 메시지 못 침)만 범위 밖. 옛 항목: — [마지막 메시지] 가 목록 맨 위(다른 브랜치일 수 있음) · 스테이징 파일이 말없이 들어감 · 원래 작성자 · 시각이 바뀜 · 작업 중에도 켜짐 · 병합 커밋 · 올린 커밋 · 옛 해시 · # 줄
완료 C-2 마지막 커밋이 아닌 커밋의 메시지 수정 (기획안 "커밋 우클릭 → 이름 변경") — 사용자 결정 좁은 범위. 이력 줄 우클릭 [메시지 바꾸기...] → 여러 줄 창 → 확인 창 → 고른 커밋 메시지만 갈고 그 뒤를 같은 트리 · 작성자 · 작성 시각으로 다시 씀(RewriteHistory), 되돌릴 자리 refs/original/…, 선택이 새 해시를 따라감. 올린 커밋 · 사이에 병합 · 다른 브랜치도 품음 · 태그 · 작업 중 · 커밋 안 한 변경 · 다른 브랜치에만 · 저장 안 한 편집 여덟 자리가 화면에서 막힘. 새 메시지 끝 줄바꿈을 git 처럼 다듬음(화면에서 찾음). 하네스 MergeSaveTest +40(272건)

D. 시험 도구 정리

상태 항목
완료 D-1 줄끝 검사 스크립트의 부모 하나 커밋 오류 · 요약 읽는 함수의 "차이 없음" (10차 E-1 에서 남김) — 부모 하나면 첫 부모와만 견준다고 적고 merge-base 를 부르지 않음 · FileState 가 "차이 없음" 을 읽음. rebase 한 길 다시: 오류 줄 0 · 커밋 뒤 요약 "차이 없음". 제품 코드 변경 없음

E. 확인 · 문서

상태 항목
완료 E-1 바꾼 길을 다시 끝까지 — A-1 아홉 경우(지운 파일 · 옛 이름 · 범위가 안내에, 두 번 뽑아도 새 폴더 둘, 막힌 파일 없이 끝) · C-1 여덟 경우(HEAD 메시지 · 작성자 보존 · 묻는 창 · 작업 중 꺼짐 · 병합 커밋 부모 둘) · C-2 로 다시 쓴 저장소에서 병합 · 다섯 길 + pull 모두 끝까지. 누른 수 = 로그, 줄끝 · BOM · 충돌 표식 · class 0, 두 탭 같은 커밋. 새로 걸린 것 없음. 시험 도구가 창 최대화를 풀던 것을 고침
완료 E-2 웹 문서 · 기획안을 11차에 맞게 — MergeHub 문서 버전 13(커밋 메시지 고치기 · 변경분 추출 두 절 · 한계 셋 · 11차 표 · 숫자, 단추 이름 91개 소스 대조로 "C# 스타일 끔" 바로잡음) · 기획안 버전 17(커밋 메시지 수정 완료 · 4단계 준비 중, 8쪽 A4 높이 같음, 잠금은 사용자)

F. 추가 요청 (2026-09-18 사용자)

상태 항목
완료 F-1 칸 이름 LOCAL(Mine) · REMOTE(Theirs) 로 맞추고 칸마다 "어느 쪽 · 어느 파일"(MERGED · 두 칸 LOCAL 은 "저장할 파일", mergetool 은 임시 파일 이름 — Mine 칸이 MERGED 이름을 보이던 것 고침), 한 줄 · 가운데 줄이기 · 툴팁 전체 · 덧: 머지 주석 [사람] 날짜 출처 설명, 출처는 로그와 같은 말(Theirs(…) · Mine(…) · REMOTE(…) · BASE(해시)), Take Mine 도 주석. 무시 조건은 원래 출처를 받는 모양이라 코드 그대로, 옛 · 새 · 출처만 다른 주석을 하네스로 굳힘. 네 길 화면 확인 · E-1 병합 길 회귀 없음 · 1,312건
완료 F-2 메서드 단위로 골라 반영 — [이 메서드 반영](C# + C/C++, 클래스 멤버 전부 · 사용자 결정), 캐럿이 놓인 멤버를 반영해 올 쪽에서 중괄호 짝으로 잡음(MemberRanges — 문자열 · 주석 · raw · #if 갈래에 안 속음, 못 잡으면 단추 끄고 까닭 한 줄). 덩어리 · 메서드 반영은 주석 한 줄(메서드 이름 위) · 로그 한 줄 · Undo 한 번 — 덩어리가 줄마다 주석을 달던 것도 고침. 메서드 반영 = 같은 줄 줄 단위 반영 바이트 같음. MemberTest 83건(C# 29 · C++ 13 멤버) · 1,395건
완료 F-3 탐색기 [보내기] 로 폴더 두 개 바로 비교 — 탐색기는 여러 개를 프로세스 하나에 인자로 모두 넘김(일곱 경우 값으로 잼), 폴더 둘은 창 하나에서 폴더 비교까지. 사용자 결정대로 3개 이상은 앞의 둘 + 알림, 260자 넘는 경로(탐색기가 8.3 이름으로 넘김 · net48 이 못 찾음)는 열지 않고 알림, 옮긴 배포 묶음은 켤 때 보내기 바로가기를 저절로 고침(바로가기 파일만 · 레지스트리 안 씀), 떠 있을 때는 새 창 그대로. 설치 파일 필요 없음. ArgsTest +16 · 1,411건. 사용자가 실제 탐색기에서 찾은 것: 보낸 왼쪽 폴더를 기본 저장소가 덮어써 "왼쪽만" 투성이 → 기본값을 먼저 두고 요청을 나중에 받게 고침, 켤 때 받은 인자를 파일 로그에 남김
완료 F-4 ACTIONS 칸 감추기(단추 · F9, 끌어 둔 폭 기억, 감춰도 Ctrl+S · Alt+←/→ 그대로) + 덧: 아래 탭 줄 접기(사용자 요청 — 플랫폼 [탭 접기] · 16 DIP 띠 · F11, 그 항목만 기억, 다른 소비 프로그램도 쓰되 기본 펼침). 1440p 150% 에서 코드 칸 폭 +163px · 높이 +71px. 플랫폼 배포함(09-22 16:22)
완료 F-5 코드 글자 크기(8~24, 기본 12) — 한 값을 모든 모니터에(모니터 배율은 플랫폼), 코드 칸만, Ctrl+휠 · Ctrl++/- · Ctrl+0 + 설정 "보기 > 코드 글자 크기"(사용자 결정). 줄 높이 · 번호 칸 · 여백 단추가 같은 비율로(CodeFontMetrics, 12 에서 지금 값 그대로), 줄 번호 기준선을 코드와 맞춤. 8 · 12 · 24 에서 네 칸 행 높이 같음 · 단추 행 안. FontTest 110 · 1,538건. Ctrl+휠 · 키 · 껐다 켜도 남음 확인. 켜자마자는 포커스가 없어 단축키가 모두 안 듣던 것(원래 있던 것)도 고침 — 포커스가 비었거나 화면 밖이면 편집기로
완료 F-6 글자를 되도록 많이 보이게 — 방법마다 1920×1080 줄 수를 재 드린 뒤 사용자 결정 "줄 간격 줄여주고 선택 사항은 만들지 마": 줄 높이 글자의 1.67배 → 1.33배(12 → 16). 두 칸 40 → 50줄(탭 줄 접으면 53), 네 칸 17 · 18 → 22 · 23줄. 한글 잘림 · 겹침 없음, E-1 회귀 없음. FontTest 144 · 1,572건
완료 F-7 대형 모니터에서 오른쪽(종료 · ACTIONS)이 잘림 — 창이 모니터 밖으로 나간 것. 켤 때 창 모드로 기억한 자리를 모니터에 조금만 걸쳐도 그대로 놓던 것을 가장 많이 겹치는 모니터 안으로 밀게(플랫폼 FitToMonitors). 재현 840px 넘침 → 0. 좁은 창 × 화면 배율 80~133% 는 원래 넘친 것 없음. PlacementTest +8. 플랫폼 배포함(09-22)
완료 F-8 저장한 뒤에도 되돌리기 — 저장 · 저장 후 커밋 뒤 Undo/Redo 유지(저장할 것 있음은 "마지막 저장과 다른가" 로), 줄을 다시 세울 때(커밋 뒤 새 HEAD · 규칙 바꾸기 · 친 뒤 재정렬) 이력을 글 단위로 옮겨 지킴, 친 것도 한 걸음. 전체 되돌리기는 파일을 연 시점. Git 탭 "푼 파일" + [다시 충돌로](이 단추만 git.exe, 사용자 결정). MergeSaveTest +21
완료 F-9 저장할 때 백업 — 설정(기본 끔)을 켜면 모든 저장(두 파일 · mergetool · Save & Commit · 병합 중 Save · 파일 단위 Accept · 폴더 복사) 직전에 지금 파일을 바이트 그대로 {설정 폴더}\Backup\MergeHub\날짜\… 에 모음(목록.txt, 저절로 안 지움). 못 만들면 저장 안 함. ACTIONS [백업 폴더 열기]. 하네스 +25
완료 F-10 칸마다 자기 줄 · 바뀐 덩어리를 잇는 선(Araxis 식, 사용자 요청으로 넓힘) — 빈 줄로 맞추지 않고 칸마다 자기 줄만, 틈에 사다리꼴 선 · 옮김 점선, 가운데 기준 스크롤, 차이 이동은 가운데로, 지운 줄 [>] 는 BASE 칸 끝. 3분할은 위 세 칸 사이. 편집기 빈 줄(StripFillers) 없앰. PaneLinkTest 17 새로 · EditorTest 14 → 18
완료 F-11 Git 계정 · URL · 토큰 저장 — 확인해 보니 껐다 켜면 셋 다 비었다. URL · 계정은 적으면 설정에 남기고, 토큰은 fetch/pull/push/클론이 성공하면 윈도 자격 증명 관리자에 저장(평문 아님 · 설정 파일에 글자 없음), 켤 때 그 서버 것만 가져옴. [토큰 지우기] · "저장됨" 표시 · 인증 실패 한글 안내. MergeSaveTest +15
완료 F-12 C# 코드 스타일 맞춤 기본값을 AURORA 로 (2026-09-18 사용자 결정) — 설정 없는 첫 실행에서 AURORA, 중괄호만 다른 C# 짝 "차이 없음" · 같은 모양의 C++ 짝은 "남은 차이 4줄"(원본 그대로). 저장 동작은 그대로. 하네스 StyleTest +12(90건)

G. 11차 뒤 추가 (2026-09-23 사용자 증상)

상태 항목
완료 G-1 배율이 크게 다른 새 모니터(3840×2160 · 300%)에서 최대화하면 오른쪽 1280px · 아래 170px 이 화면 밖으로 — 셸이 모니터별 V1 이라 최대화 크기를 윈도가 더 크게 잡았다. 최대화된 뒤 그 모니터 크기와 다르면 한 번 다시 놓게 고침(플랫폼 FitMaximizedToMonitor). 넘침 0 · 모니터 밖 요소 0개. PlacementTest +6(51건). 플랫폼 배포함(2026-09-23)
완료 G-2 새 플랫폼(D:\Sorce\ubsrepo)으로 옮겨 태움 — 우리가 옛 플랫폼에 넣었던 여덟 가지(세 갈래로 묻는 창 · 덮는 창 가운데 맞춤 · D 드라이브 없는 PC · 켤 때 터지면 안내창 · 셸 창 자리 기억 · 모니터 안으로 · 최대화 크기 맞춤 · 탭 줄 접기 F11)와 트레이(최소화하면 트레이로) 를 새 플랫폼에 넣고, MergeHub 를 그 위에서 뜨게 맞춤(플랫폼에서 없어진 사용자 이름 서비스 대신 설정 "머지 주석 > 작성자", 여백은 PlatformChrome.FullBleed, 실행은 UbisamBase.Launcher.exe). 하네스 34건 · 화면 확인(탭 접기 · F11 · 트레이 왕복 · 창 자리 기억 · 화면 밖 자리 · 두 모니터 최대화). 커밋 안 함(사용자 지시)

12차 — 폴더 비교를 읽기 쉽게 · 양방향 머지 · 화면 안내 (2026-09-23 ~)

진행 기록: history/2026-09-23-12차.md 지시서: 작업지시/12차.md

A. 폴더 비교를 읽기 쉽게

상태 항목
완료 A-1 폴더 줄의 크기가 늘 0B — 폴더 줄에 안에 든 파일 크기 합계를 적는다(하위 폴더까지, 양쪽 따로). 크기 글자도 사람이 읽는 단위로(490.2KB · 2.4MB). 걸러 낸 파일은 합계에서도 빠지고, 한쪽에만 있는 폴더는 그쪽만. 탐색기 속성과 같은 값 7곳 확인. 4,608 줄 묶음에서 합계 채우기 0ms. FolderTest +23(111건)
완료 A-2 좌우로 나눠 보이기 — 한 줄을 왼쪽 목록 · 가운데 상태 · 오른쪽 목록 세 칸으로. 칸마다 자기 쪽 이름 · 크기를 적고 그쪽에 없으면 칸을 비운다. 트리가 깊이만큼 줄을 미는 것을 되돌리고 이름만 다시 들여써(TreeDepthMarginConverter) 칸 경계 · 구분선이 줄마다 같은 자리. 접기 · 복사 · 걸러 보기 그대로. FolderTest +7(118건)

B. 파일 비교 화면

상태 항목
완료 B-1 2-Way 에서 양쪽으로 머지 — 두 파일 비교에서만(사용자 결정 2026-09-27, Git 모드의 왼쪽은 지난 커밋이라 제외). 줄마다 [<] 로 왼쪽에 반영(왼쪽에 없는 줄은 LOCAL 여백의 [<]), ACTIONS 에 ◀ 왼쪽 저장 · 오른쪽 저장 ▶ - 고친 것이 없는 쪽은 꺼짐. 두 방향이 같은 규칙(PaneText), 되돌리기는 편집마다 어느 칸인지 들고 한 스택에서, 저장 기준점 · 백업은 양쪽 따로. TwoWayTest 29건 새로
완료 B-2 프로그램 정보 창 — [단축키] 옆 [정보] 단추. 프로그램 이름 · 버전 · 빌드 날짜 · 만든 사람 · 사내 문의처(사용자 결정) + [정보 복사]. 버전은 csproj <Version>(12차 = 0.12.0)을 실행 파일에서 읽고, 빌드 날짜는 빌드할 때 어셈블리에 박는다(결정적 빌드라 PE 시각은 날짜가 아님). 만든 사람 · 문의처는 설정에서 적는다(비워 둠). AboutTest 28건 새로
완료 B-3 칸 아래에 무엇이 달라졌는지 — 칸마다 6줄 · 추가 1 · 삭제 1 · 수정 1(칸을 기준으로 읽는다, 무시 · 머지 주석 줄은 차이로 안 셈), 가운데 틈 아래에 3 / 7 · 남은 2. 3분할은 네 칸 모두 BASE 와 견주고 BASE 는 기준. 반영 · 되돌리기 · 저장마다 따라감. 5만 줄 × 두 칸 × 네 번 22ms. SummaryTest 25건 새로

C. 플랫폼

상태 항목
완료 C-1 트레이 아이콘 — 최소화하면 알림 영역으로, 왼쪽 단추로 되살리기 · 우클릭 [열기]/[종료]. 새 플랫폼(D:\Sorce\ubsrepo) 에 넣음(11차 뒤 G-2 와 같은 작업)
완료 C-3 헤더 줄도 접을 수 있게 — 창 맨 위 16 DIP 띠(⌄ 헤더 펴기 · Ctrl+F11), Ctrl+F11 로 접고 펴기, 하단에 [헤더 접기]. 접은 상태는 그 항목만 파일에 남겨 다시 켜도 접힌 채. 모듈 시작 144px → 51px(62 DIP 벌었다). F11(아래 탭 줄)은 그대로. 띠는 Border 라 끌기와 누르기를 함께 받는다(끌린 거리로 가름). 배포함 — 사용자 확인 뒤 빌드, 배포본은 bin-backup-c3 에 백업. 하네스 PlatformCfgTest 29 → 42건, 화면 21건. 배포 뒤 12차 화면 시험 아홉 벌을 전부 다시 돌렸다(2026-09-30) — 208건 실패 0 · 예외 0. 그 뒤 이 플랫폼 묶음을 공용 플랫폼(D:\Sorce\UbisamCommonPlatform)에 합쳐 배포하고 아홉 벌을 또 돌렸다 — 208건 실패 0, MergeHub 재빌드 경고 0 · 오류 0
완료 C-2 탭 줄 크기 줄이기 — 하단 탭 줄 항목을 74 → 61 DIP 로(여백 13/14→9/10 · 아이콘 22→20 · 틈 7→5 · 글자 13.5→12.5). 실측 133 → 109px(−18%), 파일 비교 코드 칸 47 → 48줄. 배포됨 — 새 플랫폼을 빌드하면서 함께 나갔고, 2026-09-28 배포본 해시 · 화면 실측(111px · 항목 109px)으로 확인

F. 메모장 탭

상태 항목
완료 F-1 하단 탭에 메모장 — 메모 + 파일 열기 둘 다, 저장 단추 없이 계속 남는다({설정 폴더}\Memo\). 이름은 메모 1 · 메모 2 번호만(빈 번호를 다시 쓴다), 파일로 연 메모와 한 탭 줄에 섞는다. 탭 줄 · 가운뎃점 · Ctrl+Tab 은 E-2 문서 탭과 같은 모양. 줄 번호 · Ctrl+휠 글자 크기 · 찾기/바꾸기. 닫을 때 저장하지 않은 것이 있으면 세 갈래로 묻는다(사용자 결정). 하네스 MemoTest 69건, 화면 30건(강제 종료 뒤 세 장 되살아남 포함)

D. 폴더 비교 화면 다시 만들기

상태 항목
완료 D-1 위쪽을 한 줄로 · 옵션은 서랍으로 — 네 줄 305px(203 DIP) → 한 줄 77px(51 DIP). 위 줄은 […] 왼쪽 ⇆ […] 오른쪽 [최근▾] 켠옵션 [비교][취소][옵션 ▾], 좌우 바꾸기를 새로 넣음. 빠른 비교 · 하위 폴더 · 보기 · 포함 · 제외는 서랍으로 넣되 켠 것만 한 줄에 짧게 적는다. 찾기는 Ctrl+F 로 펼 때만, 색 범례는 아래 상태 줄로. 되던 것은 하나도 없어지지 않음(값으로 확인). 좁은 창 1280 DIP 에서도 한 줄

E. 저장하지 않아도 남는 편집

상태 항목
완료 E-2 여러 짝을 동시에(문서 탭) — 파일 비교 맨 위에 문서 탭 줄(둘 이상일 때만 보임). 탭 이름은 파일 이름 · 다르면 왼 ↔ 오 · 겹치면 위 폴더를 덧붙임 · 저장 안 한 탭은 •. 짝을 바꿀 때 묻지 않는다(탭이 편집을 맡는다). 탭이 사라져도 고친 글은 보관함에 남아 다시 열면 되살아남(◀ ▶ 로 훑다 돌아와도). Ctrl+Tab · Ctrl+Shift+Tab · Ctrl+W · 가운데 단추 닫기. 탭마다 되돌리기 · 캐럿 · 스크롤 · 저장 형식. 상한 20(고친 탭은 안 닫음). 탭 이름은 양쪽이 같은 부분을 한 번만 적는다(WeldController_기준 ↔ 내작업.cs — 421 → 288px). 점은 사람이 손댄 것만(스타일 맞춤으로만 바뀐 것은 빼고 센다 — 묻는 자리와 같은 기준). 하네스 DocTabTest 106건, 화면 34건 · 회귀 19건 확인
완료 E-1 꺼도 작업 내용이 남아 있게(notepad++ 식) — E-2 보관함을 {설정 폴더}\Session\MergeHub\ 에 옮겨 적는다(차례는 목록.txt, 글은 짝마다 따로 파일, 원본 글은 담지 않고 파일 자취만). 글자가 멈춘 뒤 2초 · 탭을 옮기거나 닫을 때는 바로, 쓰는 일은 다른 실로. 켤 때 묻지 않고 되살리되 사용자가 지금 열라고 한 것이 먼저. 원본이 그 사이 바뀌면 되살리고 알린다. 다 저장하면 보관본을 치운다. 하네스 SessionTest 65건, 화면 24건(강제 종료 뒤 되살아남 포함)

쓰다 나온 것

상태 항목
완료 base 칸으로 머지하는 단축키(사용자 요청, 12차 G-2) — Alt+← 를 한 줄 왼쪽 파일로([<] 와 같은 일), Alt+Shift+← 를 덩어리 왼쪽으로(명령을 새로 만듦). Alt+← 는 원래 2-Way 에서 "이 줄 되돌리기" 였는데 이름·화살표와 하는 일이 달랐고, 그 뜻대로 하는 일이 B-1 로 생겨 넘겼다(되돌리기는 Ctrl+Z 만, 사용자 결정). 3-Way 는 안 건드림. 찾을 수 있게 [이 덩어리 왼쪽으로] 단추도 달았다. 화면 g2-verify 21건 · 하네스 ShortcutTest 88 → 101건. Alt+Shift 조합은 윈도우가 입력 언어 전환으로 채가 흉내 낸 키로 못 눌렀다 — 기존 Alt+Shift+→ 도 같아 시험 도구 한계이고, 덩어리는 단추로 확인했다
완료 undo 가 계속 이어진다(사용자 보고, 12차 G-1) — 짝을 바꾼 뒤 Ctrl+Z 를 누르면 앞 파일 글 ↔ 지금 파일 글을 끝없이 오갔다(40번을 눌러도 안 끝남, 글자를 안 쳐도 남). 우리 목록이 비면 Ctrl+Z 가 키를 안 먹어 TextBox 자체 되돌리기로 넘어가고, 그것이 앞 파일 글을 되살리면 Reflow 가 그걸 "친 것" 으로 보고 모델을 되돌리며 다시 쌓았다. 고침은 한 줄 — LocalEditor 에 IsUndoEnabled="False". 되돌리기는 우리 목록만 쓴다. 화면 g1-verify 14건 · 편집 관련 다섯 벌 회귀 실패 0. 글자 한 자 단위 되돌리기는 없어지고 "타이핑이 멈춘 자리" 가 한 걸음이 됐다
완료 [<] 단추가 있는 줄만 글이 밀린다(사용자 보고, 그림으로 짚어 줌) — 단추 칸 폭이 Auto 라 단추가 보이는 줄만 뒤 칸이 밀렸다(BASE 는 번호까지, LOCAL 은 코드가). GutterBothWaysWidth 로 두 칸이 같은 자리를 늘 잡아 두고, 모드에 따라 0 ↔ 단추 폭으로 갈아 끼운다. 편집기 여백도 같이 민다. 값으로 확인: 한 칸의 모든 줄이 같은 x(BASE 137 · LOCAL 1283), 글자 크기 · Git 모드도 그대로
완료 왼쪽 줄 번호가 밀린다(위를 쫓다 따로 찾음) — 12차 B-1 로 왼쪽에도 반영할 수 있게 됐는데 왼쪽 번호를 다시 매기는 자리가 없었다. 줄을 넣으면 그 줄은 번호가 비고 뒤 줄은 옛 번호(01 02 · 03 04 05 · 06), 저장하면 8줄인데 번호는 6까지. RenumberBase 를 두어 두 파일 비교에서만 왼쪽 줄을 1부터 다시 맨다. "머지 반영함" 표시가 BASE 번호를 열쇠로 쓰므로 그 열쇠도 함께 옮긴다. Git · 네 칸은 손대지 않는다
볼 것 왼쪽에만 있는 줄을 [<] 로 뺄 때 줄 수가 실제로 주는지 — 따로 열면 되는데 다른 반영 뒤에는 시험 도구가 낡은 줄 칸을 집어 값이 흔들렸다. 번호 불변식은 지켜짐

시험 도구

상태 항목
완료 화면 시험 도구를 런처에 맞춤 — 새 플랫폼은 UbisamBase.Launcher.exe 가 창 주인이라 예전 이름만 찾던 시험이 전부 "창이 안 뜬다" 로 멈춰 있었다. a2lib.ps1 에 Shell-Procs · Shell-Proc · Stop-App 을 두고 스크립트 76개 · 156곳을 함께 고침. 문법 187개 통과 · 끄고 켜고 탭 넘기기까지 실제 확인. 제품 코드 변경 없음

3~4주차로 미룬 것

디테일이라 지금 붙잡을 일이 아니다.

  • 로그인·권한
  • 대용량 파일 성능 — 잴 필요가 없어졌다(2026-09-10). 실제 소스의 가장 큰 파일이 7,479줄이고 편집·이동·재정렬이 모두 빠르다
  • 같은 줄 접기 (4차 B-2) — 차이 이동만으로 부족하다고 느끼는 순간이 오면 그때
  • 외부 편집기로 열기 (4차 B-4) — 설정 값 두 개를 채우는 수고가 얻는 것보다 컸다

드래그&드롭(D-7)과 비교 결과 내보내기(D-6)는 3차에서 앞당겨 끝냈다.


지난 기록

날짜 문서
2026-09-10 4차 — 로컬 머지툴 사용성 — 열세 항목, 열하나 완료 · 둘 취소
2026-09-09 3차 — 버그 정리 + 기능 확장 — 스물세 항목, 전부 끝
2026-09-08 2주차 — 폭 넓히기 — 기능 덩어리 ①~⑤

한 줄 요약은 history/changelog.md 에 있다.