Files
solution-erp/.claude/skills
pqhuy1987 a09dcae999 [CLAUDE] Skill: W4 positive-control - detector FIRE 5 -> va -> 0 (TOTAL 50->45, tut dung 5)
CHUOI BAT BUOC (v2 §3.3 + §2.4(4)): fire -> chung-kien -> ROI MOI va -> het fire.
CAM va permission-matrix TRUOC = mat chinh bang-chung detector co rang.

TRUOC (capture ra runs/<id>/W4-detector-fire-15-07-2026.md muc 1-5, fix#9c time-anchored):
  MED :3  writes 60 menu  but canonical=54
  MED :3  writes 240 policy but canonical=216
  MED :16 writes 60 menu  but canonical=54
  LOW :81 writes 48 policy but canonical=216
  LOW :16 title-stale anchor 2026-04-30 vs 2026-07-15 (76d)
  TOTAL FLAGS: 50  <- khop CHINH XAC du-bao W2 (WAL:17 "49->50, -1 cadence +2 policy")

SAU: permission-matrix 0 FLAG | TOTAL 45 | tut dung 5 | 0 flag moi (do bang `comm`, khong dem mat).

CACH VA = B1 bo so + tro canonical, KHONG doi so (doi so thi lan sau lai stale).
Dung dung loi khuyen detector tu in: "OR replace with pointer '-> docs/STATUS.md'".

CHUOI NHAN-QUA W1<->W2 chung duoc 3 detector doi trang-thai DUNG thiet-ke:
- h24_cadence: "missing => measuring NOTHING" -> "M = light_every = 6 (read from config)"
- spawn-model-audit: "expected constant missing" -> "[OK] claude-opus-4-8 = owner-ratified"
- GAP-3 policy: "policy=MISSING" -> "216" + BAT NGAY permission-matrix:3
  => truoc W2, nua policy KHONG THE fire vi STATUS khong co row Policies => detector IM,
     va su im-lang do trong y HET nhu "sach". Detector khong co nguon chuan = do NOTHING.

STALE NANG HON CON-SO (tim duoc luc va, detector count-token KHONG bat duoc):
  SKILL.md:20 liet "Budgets root + 3 Bg_*" nhu menu DANG SONG.
  Do dia: module Budget XOA tu S61 (Mig 50); 2 hit Bg_ con lai = COMMENT BIA-MO
  (MenuKeys.cs:70 + fe-{admin,user}/src/lib/menuKeys.ts:29). Code sach, chi skill con mo-ta.
  => gioi-han detector dem-so: thay "60 != 54" nhung khong thay "4 trong 60 do da bi xoa 60 phien truoc".

DUONG-GIA CAU-TRUC (khai, KHONG sua -- doi hanh-vi detector = quyen anh/W5):
  lead-view-auditor.md:45 FIRE title-stale vi bang vi-du cua no chua "2026-04-30" lam MAU
  minh-hoa cho class view-stale-header. Cung CO-CHE voi loi da lam acceptance FIX#6 bat-kha-thi
  (:47 chua "12 sub ... roster = 14" lam vi-du). 2 detector DOC-LAP, cung 1 file, cung 1 ly-do:
  VI-DU VE STALE TRONG Y HET STALE. File dinh-nghia anti-pattern tat-yeu chua mau anti-pattern.
  De-xuat (khong tu lam): detector can co-che mien-tru tuong-minh cho khoi vi-du.

LEAD TU BAT 2 LOI @W4:
(a) WAL ghi "permission-matrix 6 dong" -- that la 5 (dong :70 = context, khong phai flag).
    Loi dem lan thu 3 trong phien; lan nay bat TRUOC khi thanh claim gui hub.
(b) Suyt claim au canonical: grep tho MenuKeys.cs ra 64 chuoi -> SAI (dem MOI chuoi trong file,
    khong phai phan-tu mang All). W2 ground dung: |MenuKeys.All|=54 (:147) x |Actions|=4 = 216.
    Lead BO so cua minh, dung so W2. Bai hoc: do bang cong-cu sai con te hon khong do --
    vi no ra mot con-so TRONG CO VE do duoc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 15:08:09 +07:00
..

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):

---
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ể
  • 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