diff --git a/.agent/skills/error-handling-patterns/SKILL.md b/.agent/skills/error-handling-patterns/SKILL.md
new file mode 100644
index 00000000..ef65cf10
--- /dev/null
+++ b/.agent/skills/error-handling-patterns/SKILL.md
@@ -0,0 +1,443 @@
+---
+name: error-handling-patterns
+description: Global error handling, domain exceptions, và Result pattern. Use for exception middleware, validation errors, Polly resiliency, và health checks.
+compatibility: ".NET 8+, Polly, FluentValidation, Microsoft.Extensions.Diagnostics.HealthChecks"
+metadata:
+ author: Velik Ho
+ version: "1.0"
+---
+
+# Error Handling Patterns / Mẫu Xử Lý Lỗi
+
+Error handling và resiliency patterns cho GoodGo microservices.
+
+## When to Use This Skill / Khi Nào Sử Dụng
+
+Use this skill when:
+- Implementing global exception handling / Triển khai xử lý exception toàn cục
+- Creating domain exceptions / Tạo domain exceptions
+- Setting up retry policies with Polly / Cài đặt retry policies với Polly
+- Implementing Circuit Breaker pattern / Triển khai Circuit Breaker
+- Configuring health checks / Cấu hình health checks
+- Handling validation errors / Xử lý validation errors
+
+## Core Concepts / Khái Niệm Cốt Lõi
+
+### Exception Hierarchy / Phân Cấp Exception
+
+```
+ApplicationException (Base)
+├── DomainException # Business rule violations
+│ ├── ValidationException # Input validation errors
+│ ├── NotFoundException # Resource not found
+│ └── ConflictException # Duplicate resource
+├── InfrastructureException # External service failures
+│ ├── DatabaseException # Database errors
+│ └── ExternalServiceException # Third-party API errors
+└── AuthorizationException # Permission errors
+```
+
+### HTTP Status Code Mapping / Ánh Xạ Status Code
+
+| Exception Type | HTTP Status | Use Case |
+|----------------|-------------|----------|
+| `ValidationException` | 400 | Invalid input data |
+| `UnauthorizedAccessException` | 401 | Missing/invalid token |
+| `ForbiddenException` | 403 | No permission |
+| `NotFoundException` | 404 | Resource doesn't exist |
+| `ConflictException` | 409 | Duplicate resource |
+| `DomainException` | 422 | Business rule violation |
+| `Exception` | 500 | Unexpected errors |
+
+### Resiliency Patterns / Mẫu Phục Hồi
+
+| Pattern | Purpose | When to Use |
+|---------|---------|-------------|
+| **Retry** | Thử lại khi lỗi tạm thời | Network timeouts, transient DB errors |
+| **Circuit Breaker** | Ngắt mạch khi service chết | External API calls |
+| **Timeout** | Giới hạn thời gian chờ | Long-running operations |
+| **Bulkhead** | Cô lập tài nguyên | Prevent cascade failures |
+
+## Key Patterns / Mẫu Chính
+
+### Global Exception Middleware
+
+```csharp
+///
+/// EN: Global exception handler middleware.
+/// VI: Middleware xử lý exception toàn cục.
+///
+public class ExceptionHandlerMiddleware
+{
+ private readonly RequestDelegate _next;
+ private readonly ILogger _logger;
+
+ public ExceptionHandlerMiddleware(
+ RequestDelegate next,
+ ILogger logger)
+ {
+ _next = next;
+ _logger = logger;
+ }
+
+ public async Task InvokeAsync(HttpContext context)
+ {
+ try
+ {
+ await _next(context);
+ }
+ catch (Exception ex)
+ {
+ await HandleExceptionAsync(context, ex);
+ }
+ }
+
+ private async Task HandleExceptionAsync(HttpContext context, Exception ex)
+ {
+ // EN: Log full exception details
+ // VI: Log chi tiết exception đầy đủ
+ _logger.LogError(ex,
+ "EN: Unhandled exception / VI: Exception không xử lý: {Path}",
+ context.Request.Path);
+
+ var (statusCode, errorCode, message) = ex switch
+ {
+ ValidationException ve => (400, "VALIDATION_ERROR", ve.Message),
+ UnauthorizedAccessException => (401, "UNAUTHORIZED", "Authentication required"),
+ ForbiddenException => (403, "FORBIDDEN", "Access denied"),
+ NotFoundException nf => (404, "NOT_FOUND", nf.Message),
+ ConflictException ce => (409, "CONFLICT", ce.Message),
+ DomainException de => (422, "DOMAIN_ERROR", de.Message),
+ _ => (500, "INTERNAL_ERROR", "An unexpected error occurred")
+ };
+
+ context.Response.StatusCode = statusCode;
+ context.Response.ContentType = "application/json";
+
+ var response = new ApiResponse