# Skill Library — SOLUTION_ERP

Skill này là tài liệu chuyên biệt để Claude (và developer khác) dùng khi cần deep-dive 1 domain area. Claude tự động invoke qua Skill tool dựa trên semantic matching với `description` trong từng `SKILL.md`.

## Skills hiện có

### Domain skills (logic nghiệp vụ)

| Skill | Mục đích | Trigger ví dụ | Trạng thái |
|---|---|---|---|
| `contract-workflow` | State machine 9 phase + versioned workflow per ContractType + role × phase guard + SLA + auto-gen mã HĐ RG-001 | "approve contract", "chuyển phase", "versioned workflow", "HĐ cũ giữ cũ" | ✅ Tier 3 + Phase 6 cross-ref PE workflow |
| `form-engine` | Render template docx/xlsx + FieldSpec JSON + DynamicForm + PDF export LibreOffice | "export contract as word", "điền form", "render template", "PDF export" | ✅ Active |
| `permission-matrix` | Role × MenuKey × CRUD + seed + 3-layer resolution + inherit Contracts/Workflows/PurchaseEvaluations | "permission denied", "gán role", "menu không hiện", "inherit permission" | ✅ Active (Phase 6 +Pe_*/PeWf_*) |

### Ops/infra skills (devops + security + schema)

| Skill | Mục đích | Trigger ví dụ | Trạng thái |
|---|---|---|---|
| `dependency-audit-erp` | Scan CVE NuGet + npm 2 FE, respect pin constraint (MediatR 12.4.1, Swashbuckle 6.9.0) | "npm audit", "dotnet vulnerable", "deps scan", "nâng cấp package" | ✅ New Tier 3 |
| `ef-core-migration` | Tạo/revert EF Core 10 migration, 3-file rule, DesignTimeDbContextFactory, migration history (mới nhất → row cuối bảng skill; số → `docs/STATUS.md`) | "thêm migration", "EF migration", "schema update", "snapshot lỗi" | ✅ Updated S117 (mig-ref → pointer anti-drift B1; Mig 66 AddPeApprovedPriceRange row added; số → `docs/STATUS.md`) |
| `iis-deploy-runbook` | 3 IIS site + win-acme cert + gitea-runner + LibreOffice + debug 500/502/SignalR prod + **G-084 IPv4/IPv6 hardening** | "prod 500", "IIS fail", "cert hết hạn", "restart app pool", "deploy IIS", "port hijack" | ✅ Updated (G-084) |

## Format chuẩn 1 skill

Mỗi skill là 1 folder với ít nhất `SKILL.md` + optional `examples/` + `references/`:

```
.claude/skills/<skill-name>/
├── SKILL.md                  ← Entry point: description, when-to-use, workflow
├── examples/                 ← Code snippets mẫu (optional)
│   └── *.cs | *.tsx
└── references/               ← Link đến file code thật, docs (optional)
```

**Frontmatter `SKILL.md` (BẮT BUỘC `when-to-use` để skill auto-trigger):**

```markdown
---
name: skill-name-kebab-case
description: 1-3 câu mô tả skill làm gì + stack specificity (để embedding match chính xác)
when-to-use:
  - "trigger phrase 1"
  - "trigger phrase 2"
  - "keyword tiếng Việt"
---

# Skill Name

## Context
...

## Workflow / Commands
...

## Pitfalls
...

## Code pointers
- `path/to/file.cs`
```

## Tạo skill mới — checklist

1. Tạo folder `.claude/skills/<kebab-case-name>/`
2. Viết `SKILL.md` với frontmatter + sections: Context / Workflow / Code pointers / Common pitfalls
3. Add row vào bảng "Skills hiện có" phía trên
4. Update `docs/CLAUDE.md` (dòng skill count)
5. Commit `[CLAUDE] Skill: add <name>`

## Nguyên tắc design skill

**PROJECT-SPECIFIC, không clone generic:**
- Skill user-level global đã có sẵn (`code-reviewer`, `sql-database-assistant`, `focused-fix`, ...)
- Skill project-level phải encode kiến thức SOLUTION_ERP-only mà generic không có:
  - Commit convention `[CLAUDE] <scope>: ...`
  - Path pattern `src/Backend/SolutionErp.*/...`
  - Pin constraint (MediatR 12.4.1, Swashbuckle 6.9.0, TypeScript 6 erasableSyntaxOnly)
  - Gotcha-referenced (dẫn chiếu `docs/gotchas.md#N`)
  - Workflow Vietnamese-first

**Keep it actionable:**
- Commands copy-pastable (không pseudocode)
- Paths đầy đủ (không `src/...`)
- Version pinned (không "latest")
- Dẫn chiếu gotcha/migration # cụ thể

## Related

- `docs/CLAUDE.md` — quick rules + full stack context
- `docs/gotchas.md` — bẫy đã gặp (số hiện tại → `docs/STATUS.md`; latest #79 backfill soi NHẦM bảng — PE transition-marker ở `Changelogs.ContextNote` KHÔNG phải `Approvals`, verify marker-count prod trước, S97; #78 display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config, fix field `EndedByLevelFinalize`, S97; #77 SPA bundle cache-lag → verify deploy BYTE-LEVEL (curl+grep bundle), incognito = golden-test, S96; #76 `deploy.yml` render `appsettings.Production.json` từ `.example` mỗi deploy → prod thiếu config gitignored, S91; #75 seed demo UNGATED per-code → RE-ADD data đã wipe mỗi restart (wipe KHÔNG bền), S91)
- `docs/changelog/migration-todos.md` — roadmap 5 phase + Tier 3
