diff --git a/README.md b/README.md
index 09df1d2..933f2fa 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,12 @@ Windows 전용 시맨틱 런처 & 워크스페이스 매니저
개발 참고: Claw Code 동등성 작업 추적 문서
`docs/claw-code-parity-plan.md`
+- 업데이트: 2026-04-05 16:55 (KST)
+- `claw-code` 대비 AX Agent 추정 진척율 기준선을 문서에 남겼습니다. 현재 기준은 핵심 엔진 `82%`, 채팅 메인 UI `68%`, Cowork/Code 상태 UX `63%`, 내부 설정 연결 `88%`, 전체 AX Agent 동등 품질 `74%`입니다.
+- 메인 핵심 엔진 로직에 직접 영향을 주는 설정은 최소화 원칙으로 다시 검토하기 시작했습니다. 이미 실질 선택지가 사라진 `계획 모드` 계열은 사용자 노출을 더 줄였고, 남은 엔진성 설정은 개발자 탭 중심으로 계속 정리합니다.
+- 메시지 행과 좌측 대화 목록도 `claw-code` 방향으로 다시 단순화했습니다. 사용자/assistant 버블의 패딩, 라운드, 메타 텍스트를 줄였고, 대화 목록의 실행 상태도 배지 카드보다 얇은 텍스트 요약 중심으로 바꿔 읽는 축이 먼저 보이도록 눌렀습니다.
+- 검증 예정: `dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\`
+
- 업데이트: 2026-04-05 16:02 (KST)
- `document_plan` 후속 실행 분기를 `claw-code` 기준으로 다시 보강했습니다. 이제 문서 플래너 출력에서 body 골격과 즉시 실행 지시를 깨진 문자열 비교에 의존하지 않고 안정적으로 추출해, `html_create / document_assemble / docx_create / markdown_create` 후속 호출 유도가 실제로 이어집니다.
- 코워크 문서형 작업은 설정이 `planMode=off`여도 내부적으로 `always` 플랜 경로를 타도록 보정했습니다. 그래서 문서/보고서/제안서 요청은 먼저 계획을 세우고, 그 계획을 바탕으로 실제 문서 생성 단계까지 이어가도록 정리했습니다.
diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md
index 02e992d..5baec36 100644
--- a/docs/DEVELOPMENT.md
+++ b/docs/DEVELOPMENT.md
@@ -1,5 +1,8 @@
# AX Copilot - 媛쒕컻 臾몄꽌
+- Document update: 2026-04-05 16:55 (KST) - Recorded the current `claw-code` parity estimate for AX Agent: core execution engine `82%`, main chat UI `68%`, Cowork/Code status UX `63%`, internal settings linkage `88%`, overall AX Agent parity `74%`.
+- Document update: 2026-04-05 16:55 (KST) - Added an engine-settings review rule for ongoing cleanup: settings that materially alter the main execution route should be minimized, kept developer-only when necessary, or removed from user-facing surfaces when they no longer represent real runtime choices. Plan-mode remnants were reduced further as part of this pass.
+- Document update: 2026-04-05 16:55 (KST) - Simplified AX Agent message rows and sidebar conversation items toward the `claw-code` reading model. Message bubbles now use tighter padding/radius/meta text, and conversation rows now prefer lightweight running/failure summary text over heavier success/failure badge cards.
- Document update: 2026-04-05 16:02 (KST) - Fixed the Cowork document execution handoff around `document_plan`. The loop no longer depends on broken localized marker strings to detect the scaffold/body block or the immediate-next-step hint; it now extracts body markers robustly and resolves the correct follow-up tool (`html_create`, `document_assemble`, `docx_create`, `markdown_create`) before re-prompting the model.
- Document update: 2026-04-05 16:02 (KST) - Added `ResolveEffectivePlanMode(...)` so Cowork document/content tasks automatically use the `always` plan path even when the persisted plan mode is `off`. This brings Cowork closer to the `claw-code` expectation of plan-first execution for document-heavy work.
- Document update: 2026-04-05 16:02 (KST) - Strengthened `BuildCoworkSystemPrompt()` so document/report/proposal/manual requests must produce an execution plan first and are not considered complete until a real output file path has been created or updated.
diff --git a/docs/claw-code-parity-plan.md b/docs/claw-code-parity-plan.md
index 1f5b3e1..aa248a8 100644
--- a/docs/claw-code-parity-plan.md
+++ b/docs/claw-code-parity-plan.md
@@ -7,6 +7,9 @@
- Updated: 2026-04-05 15:34 (KST)
- Rebased the AX Agent improvement plan on actual `claw-code` runtime files instead of earlier AX snapshots. The reference spine is now `src/bootstrap/state.ts -> src/bridge/initReplBridge.ts -> src/bridge/sessionRunner.ts -> src/screens/REPL.tsx -> src/components/Messages.tsx -> src/components/StatusLine.tsx`.
- AX Agent work should follow that same quality order: state first, execution second, render last. UI-only fixes that bypass state/execution should be treated as temporary.
+- Updated: 2026-04-05 16:55 (KST)
+- Current estimated parity vs `claw-code`: core execution engine `82%`, main chat UI `68%`, Cowork/Code status UX `63%`, internal settings linkage `88%`, overall AX Agent `74%`.
+- Engine-affecting settings should be handled conservatively during parity work. If a setting changes the main execution route, approval flow, or recovery behavior without representing a stable real-world user choice, it should be moved to developer-only UI or removed from user-facing surfaces.
## Preserved History (Summary)
- Core loop guards and post-tool verification gates are already partially implemented.
diff --git a/src/AxCopilot/Views/ChatWindow.xaml b/src/AxCopilot/Views/ChatWindow.xaml
index 657e3c2..3b9e157 100644
--- a/src/AxCopilot/Views/ChatWindow.xaml
+++ b/src/AxCopilot/Views/ChatWindow.xaml
@@ -1888,6 +1888,7 @@
@@ -2873,6 +2874,7 @@
@@ -4498,7 +4500,7 @@
Style="{StaticResource ToggleSwitch}"/>
-
+
diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs
index 4116b1c..99c9fed 100644
--- a/src/AxCopilot/Views/ChatWindow.xaml.cs
+++ b/src/AxCopilot/Views/ChatWindow.xaml.cs
@@ -3227,16 +3227,16 @@ public partial class ChatWindow : Window
var border = new Border
{
Background = isSelected
- ? new SolidColorBrush(Color.FromArgb(0x14, 0x4B, 0x5E, 0xFC))
+ ? new SolidColorBrush(Color.FromArgb(0x10, 0x4B, 0x5E, 0xFC))
: Brushes.Transparent,
- CornerRadius = new CornerRadius(7),
- Padding = new Thickness(8, 5, 8, 5),
- Margin = isBranch ? new Thickness(14, 1, 0, 1) : new Thickness(0, 1, 0, 1),
+ CornerRadius = new CornerRadius(6),
+ Padding = new Thickness(7, 4, 7, 4),
+ Margin = isBranch ? new Thickness(12, 1, 0, 1) : new Thickness(0, 1, 0, 1),
Cursor = Cursors.Hand
};
var grid = new Grid();
- grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(20) });
+ grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(18) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
@@ -3255,7 +3255,7 @@ public partial class ChatWindow : Window
{
Text = iconText,
FontFamily = new FontFamily("Segoe MDL2 Assets"),
- FontSize = 11,
+ FontSize = 10,
Foreground = iconBrush,
VerticalAlignment = VerticalAlignment.Center
};
@@ -3270,7 +3270,7 @@ public partial class ChatWindow : Window
var title = new TextBlock
{
Text = item.Title,
- FontSize = 11,
+ FontSize = 10.5,
FontWeight = isSelected ? FontWeights.SemiBold : FontWeights.Normal,
Foreground = titleColor,
TextTrimming = TextTrimming.CharacterEllipsis
@@ -3278,7 +3278,7 @@ public partial class ChatWindow : Window
var date = new TextBlock
{
Text = item.UpdatedAtText,
- FontSize = 8.5,
+ FontSize = 8,
Foreground = dateColor,
Margin = new Thickness(0, 1, 0, 0)
};
@@ -3286,89 +3286,29 @@ public partial class ChatWindow : Window
stack.Children.Add(date);
if (item.IsRunning)
{
- stack.Children.Add(new Border
+ stack.Children.Add(new TextBlock
{
- Background = BrushFromHex("#EEF2FF"),
- BorderBrush = BrushFromHex("#C7D2FE"),
- BorderThickness = new Thickness(1),
- CornerRadius = new CornerRadius(6),
- Padding = new Thickness(4, 1, 4, 1),
+ Text = _appState.ActiveTasks.Count > 0
+ ? $"진행 중 {_appState.ActiveTasks.Count}"
+ : "진행 중",
+ FontSize = 8,
+ FontWeight = FontWeights.Medium,
+ Foreground = BrushFromHex("#4F46E5"),
Margin = new Thickness(0, 2, 0, 0),
- HorizontalAlignment = HorizontalAlignment.Left,
- Child = new TextBlock
- {
- Text = _appState.ActiveTasks.Count > 0
- ? $"진행 중 {_appState.ActiveTasks.Count}"
- : "진행 중",
- FontSize = 8,
- FontWeight = FontWeights.Medium,
- Foreground = BrushFromHex("#4F46E5"),
- }
});
}
if (item.AgentRunCount > 0)
{
- var runSummaryPanel = new DockPanel
- {
- Margin = new Thickness(0, 2, 0, 0),
- LastChildFill = true,
- };
-
- if (item.FailedAgentRunCount > 0 && item.LastFailedAt.HasValue)
- {
- var failedBadge = new Border
- {
- Background = BrushFromHex("#FEF2F2"),
- BorderBrush = BrushFromHex("#FEE2E2"),
- BorderThickness = new Thickness(1),
- CornerRadius = new CornerRadius(6),
- Padding = new Thickness(4, 1, 4, 1),
- Margin = new Thickness(0, 0, 4, 0),
- VerticalAlignment = VerticalAlignment.Center,
- Child = new TextBlock
- {
- Text = $"실패 {FormatDate(item.LastFailedAt.Value)}",
- FontSize = 8,
- FontWeight = FontWeights.Medium,
- Foreground = BrushFromHex("#B91C1C"),
- }
- };
- DockPanel.SetDock(failedBadge, Dock.Right);
- runSummaryPanel.Children.Add(failedBadge);
- }
- else if (item.LastCompletedAt.HasValue)
- {
- var completedBadge = new Border
- {
- Background = BrushFromHex("#ECFDF5"),
- BorderBrush = BrushFromHex("#DCFCE7"),
- BorderThickness = new Thickness(1),
- CornerRadius = new CornerRadius(6),
- Padding = new Thickness(4, 1, 4, 1),
- Margin = new Thickness(0, 0, 4, 0),
- VerticalAlignment = VerticalAlignment.Center,
- Child = new TextBlock
- {
- Text = $"성공 {FormatDate(item.LastCompletedAt.Value)}",
- FontSize = 8,
- FontWeight = FontWeights.Medium,
- Foreground = BrushFromHex("#166534"),
- }
- };
- DockPanel.SetDock(completedBadge, Dock.Right);
- runSummaryPanel.Children.Add(completedBadge);
- }
-
var runSummaryText = new TextBlock
{
Text = item.FailedAgentRunCount > 0
- ? $"실행 {item.AgentRunCount} · 실패 {item.FailedAgentRunCount} · {TruncateForStatus(item.LastAgentRunSummary, 28)}"
- : $"실행 {item.AgentRunCount} · {TruncateForStatus(item.LastAgentRunSummary, 32)}",
+ ? $"실패 {item.FailedAgentRunCount} · {TruncateForStatus(item.LastAgentRunSummary, 26)}"
+ : $"실행 {item.AgentRunCount} · {TruncateForStatus(item.LastAgentRunSummary, 28)}",
FontSize = 8.25,
Foreground = item.FailedAgentRunCount > 0
? BrushFromHex("#B91C1C")
: (TryFindResource("SecondaryText") as Brush ?? Brushes.Gray),
- Margin = new Thickness(0, 1, 0, 0),
+ Margin = new Thickness(0, 2, 0, 0),
TextTrimming = TextTrimming.CharacterEllipsis
};
if (!string.IsNullOrWhiteSpace(item.LastAgentRunSummary))
@@ -3377,8 +3317,7 @@ public partial class ChatWindow : Window
? $"최근 실패 포함\n{item.LastAgentRunSummary}"
: item.LastAgentRunSummary;
}
- runSummaryPanel.Children.Add(runSummaryText);
- stack.Children.Add(runSummaryPanel);
+ stack.Children.Add(runSummaryText);
}
Grid.SetColumn(stack, 1);
grid.Children.Add(stack);
@@ -4447,7 +4386,7 @@ public partial class ChatWindow : Window
{
HorizontalAlignment = HorizontalAlignment.Right,
MaxWidth = GetMessageMaxWidth(),
- Margin = new Thickness(172, 2, 16, 2),
+ Margin = new Thickness(196, 2, 12, 2),
};
var bubble = new Border
@@ -4455,16 +4394,16 @@ public partial class ChatWindow : Window
Background = userBubbleBg,
BorderBrush = borderBrush,
BorderThickness = new Thickness(1),
- CornerRadius = new CornerRadius(13),
- Padding = new Thickness(12, 8, 12, 8),
+ CornerRadius = new CornerRadius(12),
+ Padding = new Thickness(11, 7, 11, 7),
Child = new TextBlock
{
Text = content,
TextAlignment = TextAlignment.Left,
- FontSize = 12,
+ FontSize = 11.5,
Foreground = primaryText,
TextWrapping = TextWrapping.Wrap,
- LineHeight = 19,
+ LineHeight = 18,
}
};
wrapper.Children.Add(bubble);
@@ -4492,7 +4431,7 @@ public partial class ChatWindow : Window
userBottomBar.Children.Add(new TextBlock
{
Text = timestamp.ToString("HH:mm"),
- FontSize = 8.5, Opacity = 0.46,
+ FontSize = 8, Opacity = 0.42,
Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Center,
@@ -4530,19 +4469,19 @@ public partial class ChatWindow : Window
{
HorizontalAlignment = HorizontalAlignment.Left,
MaxWidth = GetMessageMaxWidth(),
- Margin = new Thickness(6, 2, 180, 2)
+ Margin = new Thickness(4, 2, 164, 2)
};
if (animate) ApplyMessageEntryAnimation(container);
// AI 에이전트 이름 + 아이콘
var (agentName, _, _) = GetAgentIdentity();
- var headerSp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(3, 0, 0, 1) };
+ var headerSp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(2, 0, 0, 1) };
var iconBlock = new TextBlock
{
Text = "\uE945",
FontFamily = new FontFamily("Segoe MDL2 Assets"),
- FontSize = 7.5,
+ FontSize = 7,
Foreground = secondaryText,
VerticalAlignment = VerticalAlignment.Center,
};
@@ -4551,7 +4490,7 @@ public partial class ChatWindow : Window
headerSp.Children.Add(new TextBlock
{
Text = agentName,
- FontSize = 8.5,
+ FontSize = 8,
FontWeight = FontWeights.Normal,
Foreground = secondaryText,
Margin = new Thickness(3, 0, 0, 0),
@@ -4564,8 +4503,8 @@ public partial class ChatWindow : Window
Background = assistantBubbleBg,
BorderBrush = borderBrush,
BorderThickness = new Thickness(1),
- CornerRadius = new CornerRadius(13),
- Padding = new Thickness(12, 8, 12, 8),
+ CornerRadius = new CornerRadius(12),
+ Padding = new Thickness(11, 7, 11, 7),
};
var contentStack = new StackPanel();