diff --git a/doc/history/2026-09-10-4차.md b/doc/history/2026-09-10-4차.md
index dbad39d..dbd31f1 100644
--- a/doc/history/2026-09-10-4차.md
+++ b/doc/history/2026-09-10-4차.md
@@ -126,4 +126,34 @@ doc/
| [저장하지 않고 계속] | 파일은 손대지 않은 채 다음 파일이 열렸다 |
| 고친 것 없이 두 번 연속 열기 | 창이 뜨지 않았다 |
-검사 514건 통과 · 빌드 경고 0 · 오류 0.
\ No newline at end of file
+검사 514건 통과 · 빌드 경고 0 · 오류 0.
+---
+
+## A-2. 내보낸 보고서에 만든 사람이 없던 것 — **완료** (2026-09-10)
+
+**왜** - `결과 내보내기` 로 뽑은 글에 `만든 때` 는 있는데 **누가 뽑았는지가 없었다.**
+남에게 보내라고 만든 기능인데 작성자가 없으면 받는 쪽이 되묻게 된다.
+
+**이름 판단을 한 함수로 모았다.** `MergeNote.AuthorOf` 를 새로 빼고 `MergeNote.Build` 도 그것을 쓴다.
+설정에 적힌 이름이 없으면 윈도우 계정으로 물러선다. **같은 사람이 같은 화면에서 한 일인데
+주석과 보고서에 다른 이름이 남으면 그 자체가 버그다** - 판단이 두 군데로 갈리면 언젠가 어긋난다.
+
+**이름이 비어 있으면 줄 자체를 넣지 않는다.** `만든 사람: ` 만 덩그러니 있는 것보다 없는 편이 낫다.
+
+파일 비교 · 폴더 비교 두 보고서에 모두 들어간다. 자리는 `만든 때` 바로 아래다.
+
+**확인한 것**
+
+실제로 뽑아 본 파일 머리글이다.
+
+```
+MergeHub 파일 비교 결과
+만든 때: 2026-09-10 20:33:17
+만든 사람: 김승준
+왼쪽 : ...\left\Other.cpp
+오른쪽: ...\right\Other.cpp
+```
+
+화면의 머지 주석 미리보기가 `// [김승준] 2026-09-10` 이었으니 **두 이름이 같다.**
+
+검사 8건 추가(`ReportTest` 23 → 31). 전체 **522건 통과** · 빌드 경고 0 · 오류 0.
\ No newline at end of file
diff --git a/doc/history/changelog.md b/doc/history/changelog.md
index 8ec1919..ce347fa 100644
--- a/doc/history/changelog.md
+++ b/doc/history/changelog.md
@@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 |
|---|---|---|
+| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |
| 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 |
| 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 |
| 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 |
@@ -28,6 +29,7 @@
| 날짜 | 문서 | 내용 |
|---|---|---|
+| 2026-09-10 | **4차 A-2** — 내보낸 보고서 머리글에 만든 사람을 넣음. 이름 판단을 머지 주석과 한 함수로 모았다 | 아래 |
| 2026-09-10 | **4차 A-1** — 저장하지 않은 편집이 말없이 사라지던 길 여덟 군데를 막음. 플랫폼에 세 갈래 확인 창을 새로 넣었다 | 아래 |
| 2026-09-10 | **4차 D-2** — 항목을 끝내면 상세·상태·한 줄을 각각 어디에 적을지 공통 규칙으로 못박음 | 아래 |
| 2026-09-10 | **4차 D-1** — 721줄짜리 진행상황을 `history/` 의 날짜별 파일로 나누고 지시서를 `작업지시/` 로 모음 | 아래 |
diff --git a/doc/진행상황.md b/doc/진행상황.md
index c9a8a14..660669d 100644
--- a/doc/진행상황.md
+++ b/doc/진행상황.md
@@ -23,7 +23,7 @@
| 상태 | 항목 |
|---|---|
| **완료** | A-1 저장하지 않은 편집이 말없이 사라진다 |
-| 대기 | A-2 내보낸 보고서에 만든 사람이 없다 |
+| **완료** | A-2 내보낸 보고서에 만든 사람이 없다 |
### B. 매일 쓰는 마찰 줄이기
diff --git a/src/MergeHub/Services/CompareReport.cs b/src/MergeHub/Services/CompareReport.cs
index a26f82b..65de3c3 100644
--- a/src/MergeHub/Services/CompareReport.cs
+++ b/src/MergeHub/Services/CompareReport.cs
@@ -20,11 +20,11 @@ namespace MergeHub.Services
/// 파일 비교 결과.
public static string ForFile(string leftLabel, string rightLabel,
- IReadOnlyList lines, DateTime when)
+ IReadOnlyList lines, DateTime when, string? author = null)
{
var text = new StringBuilder();
- Head(text, "파일 비교 결과", leftLabel, rightLabel, when);
+ Head(text, "파일 비교 결과", leftLabel, rightLabel, when, author);
var changed = 0;
var added = 0;
@@ -73,11 +73,11 @@ namespace MergeHub.Services
/// 폴더 비교 결과.
public static string ForFolder(string leftFolder, string rightFolder,
- FolderCompareResult result, DateTime when)
+ FolderCompareResult result, DateTime when, string? author = null)
{
var text = new StringBuilder();
- Head(text, "폴더 비교 결과", leftFolder, rightFolder, when);
+ Head(text, "폴더 비교 결과", leftFolder, rightFolder, when, author);
text.AppendLine("요약: " + result.Summary);
if (result.Truncated) text.AppendLine("(항목이 너무 많아 도중에 멈춘 결과입니다)");
text.AppendLine();
@@ -115,10 +115,16 @@ namespace MergeHub.Services
}
}
- private static void Head(StringBuilder text, string title, string left, string right, DateTime when)
+ ///
+ /// 뽑은 사람. 남에게 보내라고 만든 글이라 누가 뽑았는지가 없으면 받는 쪽이 되묻게 된다.
+ /// 비어 있으면 줄 자체를 넣지 않는다 - "만든 사람: " 만 덩그러니 있는 것보다 없는 편이 낫다.
+ ///
+ private static void Head(StringBuilder text, string title, string left, string right, DateTime when,
+ string? author)
{
text.AppendLine($"MergeHub {title}");
text.AppendLine($"만든 때: {when:yyyy-MM-dd HH:mm:ss}");
+ if (!string.IsNullOrWhiteSpace(author)) text.AppendLine($"만든 사람: {author}");
text.AppendLine($"왼쪽 : {left}");
text.AppendLine($"오른쪽: {right}");
text.AppendLine(Rule);
@@ -144,4 +150,4 @@ namespace MergeHub.Services
_ => "같음"
};
}
-}
\ No newline at end of file
+}
diff --git a/src/MergeHub/Services/MergeNote.cs b/src/MergeHub/Services/MergeNote.cs
index bdf73cf..af2f91f 100644
--- a/src/MergeHub/Services/MergeNote.cs
+++ b/src/MergeHub/Services/MergeNote.cs
@@ -21,9 +21,19 @@ namespace MergeHub.Services
/// 주석 한 조각을 만든다. 구성은 딱 세 가지 - [사용자] 날짜 설명.
/// 설명이 비어 있어도 [사용자]와 날짜는 항상 남는다.
///
+ ///
+ /// 기록에 남길 사람 이름. 설정에 적힌 이름이 없으면 윈도우 계정으로 물러선다.
+ ///
+ /// 따로 뺀 까닭 - 머지 주석과 내보낸 보고서에 같은 이름이 찍혀야 한다.
+ /// 같은 사람이 같은 화면에서 한 일인데 두 곳에 다른 이름이 남으면 그 자체가 버그다.
+ /// 판단이 두 군데로 갈리면 언젠가 어긋난다.
+ ///
+ public static string AuthorOf(string? author) =>
+ string.IsNullOrWhiteSpace(author) ? Environment.UserName : author!.Trim();
+
public static string Build(string? author, DateTime when, string? comment, string? path)
{
- var who = string.IsNullOrWhiteSpace(author) ? Environment.UserName : author!.Trim();
+ var who = AuthorOf(author);
var body = $"[{who}] {when:yyyy-MM-dd}";
diff --git a/src/MergeHub/ViewModels/FolderViewModel.cs b/src/MergeHub/ViewModels/FolderViewModel.cs
index feeac81..ef73643 100644
--- a/src/MergeHub/ViewModels/FolderViewModel.cs
+++ b/src/MergeHub/ViewModels/FolderViewModel.cs
@@ -270,7 +270,9 @@ namespace MergeHub.ViewModels
try
{
- var report = CompareReport.ForFolder(LeftFolder, RightFolder, result, DateTime.Now);
+ // 파일 비교 쪽과 같은 이름이 찍혀야 한다(MergeNote.AuthorOf).
+ var report = CompareReport.ForFolder(LeftFolder, RightFolder, result, DateTime.Now,
+ MergeNote.AuthorOf(_workspace.AuthorName));
TextFile.Write(dialog.FileName, report);
MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}");
}
diff --git a/src/MergeHub/ViewModels/HomeViewModel.cs b/src/MergeHub/ViewModels/HomeViewModel.cs
index 5d99cf1..baa0488 100644
--- a/src/MergeHub/ViewModels/HomeViewModel.cs
+++ b/src/MergeHub/ViewModels/HomeViewModel.cs
@@ -1591,9 +1591,11 @@ namespace MergeHub.ViewModels
try
{
+ // 머지 주석과 같은 자리에서 이름을 가져온다. 두 곳에 다른 이름이 찍히면 그 자체가 버그다.
var report = CompareReport.ForFile(ReportLabel(BaseHeader, LeftFile),
ReportLabel(LocalHeader, RightFile),
- Lines, DateTime.Now);
+ Lines, DateTime.Now,
+ MergeNote.AuthorOf(_workspace.AuthorName));
TextFile.Write(dialog.FileName, report);
MessageUtil.ShowSuccessToast($"저장했습니다 · {Path.GetFileName(dialog.FileName)}");
}