PK Lint: Rà soát + sửa chữa hệ thống
Ensure snapshot (bắt buộc, đầu flow)
- Precondition:
.cockpit/ tồn tại. Thiếu → route pk-init (mode new), KHÔNG nạp gì thêm, dừng.
- Idempotent qua marker: phiên CHƯA có marker
SNAPSHOT_LOADED → tự nạp full theo Snapshot Contract
(../pk-shared/references/snapshot-contract.md) rồi đặt marker SNAPSHOT_LOADED. Đã có marker (vd
harness Phase 1 đã đặt) → skip, không đọc lại.
3 mode: check (mặc định, read-only), fix (consolidation + rebuild + restore), evolve (schema-review).
Mode check (health check, read-only)
Ranh giới: pk-analyze đếm số liệu tổng cho dashboard. pk-lint soi chi tiết từng file.
Hạng mục kiểm tra
1. Registry sync
- knowledge/index.md: mỗi entry → file tồn tại. File trong knowledge/ không trong index → báo.
- skills/registry.md, workflows/registry.md: tương tự.
2. Link integrity
- Quét mọi cross-reference nội bộ cockpit:
[[slug]], [text](path), frontmatter related, source_file, frontmatter skills_used: [...] của workflow, marker → Skill: [[X]] trong procedure block
- Resolve: tìm file
{type}-{slug}.md trong knowledge/, skills/, workflows/. Kiểm tra path đích tồn tại.
- Link mồ côi (trỏ tới slug đã gộp/deprecate/archive): báo cụ thể file nguồn + tham chiếu hỏng. Đây là lưới an toàn cho sau khi pk-distill grep-rewrite inbound link.
- Slug trùng (2 file khác type cùng slug): báo vi phạm bất biến unique-slug (canonical:
../pk-shared/references/schemas.md, mục "Bất biến unique-slug").
- Skill con không tồn tại/archive: khi
skills_used hoặc → Skill: [[X]] trỏ tới skill đã archive hoặc không tồn tại, báo cụ thể file nguồn + tham chiếu hỏng.
- Link hỏng khác → báo cụ thể (file nguồn, dòng, link hỏng, lý do)
3. Frontmatter check (spec: ../pk-shared/references/schemas.md)
- Mọi page:
type, title, status, updated
- Knowledge: thêm
confidence
- Skill: thêm
version, trigger, input, output
- Workflow: thêm
version, trigger
- Thiếu → báo cụ thể
4. Inbox backlog
- Tuổi theo
captured_at, ngưỡng theo Inbox Aging trong ../pk-shared/references/schemas.md. Trong check report:
- 7-30 ngày → liệt kê tồn đọng
30 ngày → cảnh báo
- Bổ sung đối chiếu bảng "Ngưỡng nhắc xử lý" (canonical: ../pk-shared/references/schemas.md, cùng mục "Inbox Aging + Ngưỡng nhắc xử lý"): >= 10 item pending, hoặc có item pending > 14 ngày → gợi ý chạy pk-distill/pk-track inbox-only.
- Phân execution vs knowledge.
5. Reachability audit
- File trong
.cockpit/ không neo vào SOT → báo mồ côi. Bảng neo SOT canonical: ../pk-shared/references/snapshot-contract.md mục "Reachability khi ghi". Không chép bảng; trỏ về.
- Orphan-action: action có
key_result null/rỗng, hoặc key_result trỏ tới KR không tồn tại trong objective.md → báo orphan-action kèm action ID và lý do cụ thể (thiếu field vs. KR không tồn tại).
6. Knowledge health metrics
- Page count, freshness, orphans, usage distribution theo ../pk-shared/references/metrics.md, KHÔNG chép công thức
7. Kiểm thủ công drift prose (thủ công, không auto)
- (a) README architecture map: đối chiếu sơ đồ cây
.cockpit/ trong README.md với cấu trúc .cockpit/ thật. Nếu có file/folder mới chưa xuất hiện trong sơ đồ, báo để cập nhật thủ công.
- (b) flows.md: đối chiếu "4 điểm tích hợp" trong
skills/pk-harness/references/flows.md với bảng cross-call hợp lệ trong ../pk-shared/references/cross-call-rules.md. Nếu lệch, báo để cập nhật thủ công.
- Hạng mục này KHÔNG tự fix được bằng grep; yêu cầu người dùng xác nhận và sửa.
8. AGENTS.md sync (auto-fix được, xem rebuild-index)
- Kiểm
AGENTS.md tại root workspace có block marker <!-- personal-assistant:start --> / <!-- personal-assistant:end --> không. Thiếu (kể cả thiếu file, vd project khởi tạo trước khi có feature này) → báo agents-md-missing.
- Có block → đối chiếu nội dung giữa marker với format canonical
../pk-shared/references/schemas.md (mục "AGENTS.md block format"): 6 dòng @.cockpit/... đủ và đúng path không, có đủ 3 mục hành vi (### Tự capture khi mạch việc hoàn tất, ### Dùng lại tri thức đã đúc kết, ### Nhắc xử lý inbox) không, block ≤ 45 dòng giữa marker không, mô tả nhiệm vụ còn khớp không. Lệch (kể cả block cũ chỉ có ### Cuối phiên — tạo trước feature ambient) → báo agents-md-drift.
- Khác hạng mục 7: cái này tự fix được (block giữa marker là sổ sách dẫn xuất) → backfill/regenerate ở rebuild-index.
9. CLAUDE.md liên kết (CHỈ CẢNH BÁO, KHÔNG tự sửa)
- Kiểm root workspace:
CLAUDE.md tồn tại VÀ chứa dòng @AGENTS.md?
- Thiếu một trong hai → báo
claude-md-not-linked kèm hướng dẫn 1 dòng: "Thêm dòng @AGENTS.md vào CLAUDE.md để quy tắc ambient được nạp mỗi phiên."
- KHÔNG tự sửa, KHÔNG tạo CLAUDE.md (việc nối thuộc user — giữ nguyên quy tắc "KHÔNG tạo/sửa CLAUDE.md" ở rebuild-index). Đây là mắt xích quyết định sự sống của toàn bộ ambient flow; thiếu nó thì 3 mục hành vi trong AGENTS.md không bao giờ được nạp.
Output
## Check Report - YYYY-MM-DD
### Registry lệch (N)
### Link hỏng (N)
### Thiếu frontmatter (N)
### Inbox tồn đọng (N)
### Reachability (N) (gồm orphan-action: N)
### Knowledge metrics
### AGENTS.md sync (agents-md-missing / agents-md-drift)
### CLAUDE.md liên kết (claude-md-not-linked)
✅ Không có vấn đề (nếu clean)
Mode fix
Sub-mode: consolidation (deep audit)
Đọc NỘI DUNG tất cả pages. Rà soát:
- Mâu thuẫn nội dung giữa pages
- Pages chồng chéo → đề xuất gộp
- Pages lỗi thời (> 90 ngày không update) → hạ confidence hoặc archive
- Nhất quán thuật ngữ
- Workflow dependency outdated
Trình report → user duyệt → thực thi thay đổi. Khi ghi đè nội dung page: trước khi ghi, đọc body hiện tại (bất biến: ../pk-shared/references/snapshot-contract.md, mục "Bất biến đọc body trước khi ghi body").
Sub-mode: rebuild-index
Sinh lại file dẫn xuất từ nguồn gốc (frontmatter + log), format theo spec ../pk-shared/references/schemas.md:
- Quét knowledge/*.md → sinh knowledge/index.md (bao gồm cột Redirect từ frontmatter
redirect_to)
- Quét skills/*.md → sinh skills/registry.md
- Quét workflows/*.md → sinh workflows/registry.md
- Tái sinh bảng consumer trong
../pk-shared/SKILL.md: grep ngược qua tất cả skills/pk-*/SKILL.md, tìm dòng tham chiếu ../pk-shared/references/<file>.md. Với mỗi reference file, liệt kê danh sách skill đang tham chiếu → cập nhật cột "Skill tiêu thụ chính" trong bảng References của pk-shared/SKILL.md. Bảng consumer là bản phái sinh; rebuild-index là cơ chế tái sinh chuẩn.
- Regenerate AGENTS.md block (backfill
agents-md-missing / sửa agents-md-drift): ghi lại block giữa marker <!-- personal-assistant:start/end --> theo format canonical ../pk-shared/references/schemas.md (mục "AGENTS.md block format"). Idempotent theo quy tắc ghi tại canonical (tạo mới / append / replace giữa marker). Chỉ động vùng trong marker, KHÔNG đụng nội dung khác của AGENTS.md, KHÔNG tạo/sửa CLAUDE.md.
Cột Usage tái dẫn xuất từ log theo công thức ../pk-shared/references/metrics.md mục "Usage count (canonical)". Fallback: log thiếu thì giữ giá trị Usage cũ trong index; không có giá trị cũ thì để 0. (Usage được tính từ log, không phải frontmatter.) Cột Usage là cache-hint; log là SOT (xem ../pk-shared/references/sot-ownership.md).
Cột Redirect: lấy từ frontmatter redirect_to. Rỗng nếu không có hoặc status không phải stub.
Sub-mode: restore
Khôi phục page/bó từ archive/:
- Xác định mục tiêu (slug hoặc liệt kê archive)
- Move file về đích. KHÔNG ghi đè nếu xung đột.
- Đổi
status → active
- Rebuild index
- Log
Fix tự động vs cần duyệt
Tự fix (sổ sách dẫn xuất): registry thiếu/thừa entry so với file thật.
Cần duyệt: link hỏng, frontmatter thiếu, inbox tồn, gộp pages.
Mode evolve (schema-review)
Tổng hợp tín hiệu "khuôn không vừa" → đề xuất diff lên SCHEMA.md.
Flow
- Đọc
schema-signals.md (BỎ QUA promote-candidate)
- Quét sống: đếm page/type, cụm tag, file phình (KHÔNG dùng cho glossary, xem ghi chú bên dưới)
- Áp ngưỡng (bảo thủ: thà bỏ sót hơn báo nhiễu). Ngưỡng canonical:
../pk-shared/references/schemas.md, mục "Bảng ngưỡng emit/act".
- Sinh đề xuất diff
- User duyệt
- Migrate: bump version, rewrite link, rebuild index
- Move tín hiệu đã batch sang "Đã xử lý" trong schema-signals.md kèm kết quả (duyệt hoặc bác). Chạy cả khi user bác đề xuất.
4 loại thay đổi
Ngưỡng đầy đủ (emit-threshold + act-threshold) tại ../pk-shared/references/schemas.md, mục "Bảng ngưỡng emit/act".
| Thay đổi |
Tín hiệu đọc |
| Thêm page type |
no-fit-type |
| Đổi layout (tách subfolder) |
(đếm trực tiếp page active) |
| Đổi format (template hoá section) |
adhoc-section |
| Thêm glossary |
term-repeat |
Ghi chú:
- query-miss là bằng chứng phụ, không tự kích hoạt thay đổi.
- Dưới ngưỡng: GIỮ tín hiệu, không xoá.
- Glossary: đọc tín hiệu
term-repeat từ schema-signals.md thay cho "quét sống". pk-distill emit term-repeat khi xử lý nội dung (đáng tin hơn quét tĩnh).
Log
---
timestamp: YYYY-MM-DDTHH:mm
type: knowledge-activity
source_skill: pk-lint
---
Lint [mode]: N vấn đề, M fixed
Quy tắc
- Check mode thuần read-only.
- Fix: tách phát hiện khỏi quyết định. User duyệt nội dung, tự fix sổ sách.
- Evolve: không auto-migrate. Mọi batch gate qua user.
- Reversibility: không hard delete. Archive.
1---2name: pk-lint3description: Kiểm tra sức khoẻ hệ thống .cockpit/: link hỏng, registry lệch, file mồ côi, schema cũ. 3 mode: check (rà soát read-only), fix (sửa + rebuild index), evolve (nâng cấp schema). Dùng khi user nói 'lint', 'kiểm tra hệ thống', 'dọn dẹp cockpit', 'audit', 'rebuild index', hoặc nghi ngờ dữ liệu cockpit bị lệch.4---56# PK Lint: Rà soát + sửa chữa hệ thống78## Ensure snapshot (bắt buộc, đầu flow)9101. **Precondition**: `.cockpit/` tồn tại. Thiếu → route `pk-init` (mode new), KHÔNG nạp gì thêm, dừng.112. **Idempotent qua marker**: phiên CHƯA có marker `SNAPSHOT_LOADED` → tự nạp full theo Snapshot Contract12 (`../pk-shared/references/snapshot-contract.md`) rồi đặt marker `SNAPSHOT_LOADED`. Đã có marker (vd13 harness Phase 1 đã đặt) → skip, không đọc lại.14153 mode: **check** (mặc định, read-only), **fix** (consolidation + rebuild + restore), **evolve** (schema-review).1617## Mode check (health check, read-only)1819Ranh giới: pk-analyze đếm số liệu tổng cho dashboard. pk-lint soi chi tiết từng file.2021### Hạng mục kiểm tra2223**1. Registry sync**24- knowledge/index.md: mỗi entry → file tồn tại. File trong knowledge/ không trong index → báo.25- skills/registry.md, workflows/registry.md: tương tự.2627**2. Link integrity**28- Quét mọi cross-reference nội bộ cockpit: `[[slug]]`, `[text](path)`, frontmatter `related`, `source_file`, frontmatter `skills_used: [...]` của workflow, marker `→ Skill: [[X]]` trong procedure block29- Resolve: tìm file `{type}-{slug}.md` trong knowledge/, skills/, workflows/. Kiểm tra path đích tồn tại.30- **Link mồ côi** (trỏ tới slug đã gộp/deprecate/archive): báo cụ thể file nguồn + tham chiếu hỏng. Đây là lưới an toàn cho sau khi pk-distill grep-rewrite inbound link.31- **Slug trùng** (2 file khác type cùng slug): báo vi phạm bất biến unique-slug (canonical: `../pk-shared/references/schemas.md`, mục "Bất biến unique-slug").32- **Skill con không tồn tại/archive**: khi `skills_used` hoặc `→ Skill: [[X]]` trỏ tới skill đã archive hoặc không tồn tại, báo cụ thể file nguồn + tham chiếu hỏng.33- Link hỏng khác → báo cụ thể (file nguồn, dòng, link hỏng, lý do)3435**3. Frontmatter check** (spec: ../pk-shared/references/schemas.md)36- Mọi page: `type`, `title`, `status`, `updated`37- Knowledge: thêm `confidence`38- Skill: thêm `version`, `trigger`, `input`, `output`39- Workflow: thêm `version`, `trigger`40- Thiếu → báo cụ thể4142**4. Inbox backlog**43- Tuổi theo `captured_at`, ngưỡng theo Inbox Aging trong ../pk-shared/references/schemas.md. Trong check report:44 - 7-30 ngày → liệt kê tồn đọng45 - > 30 ngày → cảnh báo46- Bổ sung đối chiếu bảng "Ngưỡng nhắc xử lý" (canonical: ../pk-shared/references/schemas.md, cùng mục "Inbox Aging + Ngưỡng nhắc xử lý"): >= 10 item pending, hoặc có item pending > 14 ngày → gợi ý chạy pk-distill/pk-track inbox-only.47- Phân execution vs knowledge.4849**5. Reachability audit**50- File trong `.cockpit/` không neo vào SOT → báo mồ côi. Bảng neo SOT canonical: `../pk-shared/references/snapshot-contract.md` mục "Reachability khi ghi". Không chép bảng; trỏ về.51- **Orphan-action**: action có `key_result` null/rỗng, hoặc `key_result` trỏ tới KR không tồn tại trong objective.md → báo `orphan-action` kèm action ID và lý do cụ thể (thiếu field vs. KR không tồn tại).5253**6. Knowledge health metrics**54- Page count, freshness, orphans, usage distribution theo ../pk-shared/references/metrics.md, KHÔNG chép công thức5556**7. Kiểm thủ công drift prose** (thủ công, không auto)57- (a) README architecture map: đối chiếu sơ đồ cây `.cockpit/` trong README.md với cấu trúc `.cockpit/` thật. Nếu có file/folder mới chưa xuất hiện trong sơ đồ, báo để cập nhật thủ công.58- (b) flows.md: đối chiếu "4 điểm tích hợp" trong `skills/pk-harness/references/flows.md` với bảng cross-call hợp lệ trong `../pk-shared/references/cross-call-rules.md`. Nếu lệch, báo để cập nhật thủ công.59- Hạng mục này KHÔNG tự fix được bằng grep; yêu cầu người dùng xác nhận và sửa.6061**8. AGENTS.md sync** (auto-fix được, xem rebuild-index)62- Kiểm `AGENTS.md` tại root workspace có block marker `<!-- personal-assistant:start -->` / `<!-- personal-assistant:end -->` không. Thiếu (kể cả thiếu file, vd project khởi tạo trước khi có feature này) → báo `agents-md-missing`.63- Có block → đối chiếu nội dung giữa marker với format canonical `../pk-shared/references/schemas.md` (mục "AGENTS.md block format"): 6 dòng `@.cockpit/...` đủ và đúng path không, có **đủ 3 mục hành vi** (`### Tự capture khi mạch việc hoàn tất`, `### Dùng lại tri thức đã đúc kết`, `### Nhắc xử lý inbox`) không, block ≤ 45 dòng giữa marker không, mô tả nhiệm vụ còn khớp không. Lệch (kể cả block cũ chỉ có `### Cuối phiên` — tạo trước feature ambient) → báo `agents-md-drift`.64- Khác hạng mục 7: cái này tự fix được (block giữa marker là sổ sách dẫn xuất) → backfill/regenerate ở rebuild-index.6566**9. CLAUDE.md liên kết** (CHỈ CẢNH BÁO, KHÔNG tự sửa)67- Kiểm root workspace: `CLAUDE.md` tồn tại VÀ chứa dòng `@AGENTS.md`?68- Thiếu một trong hai → báo `claude-md-not-linked` kèm hướng dẫn 1 dòng: "Thêm dòng `@AGENTS.md` vào CLAUDE.md để quy tắc ambient được nạp mỗi phiên."69- **KHÔNG tự sửa, KHÔNG tạo CLAUDE.md** (việc nối thuộc user — giữ nguyên quy tắc "KHÔNG tạo/sửa CLAUDE.md" ở rebuild-index). Đây là mắt xích quyết định sự sống của toàn bộ ambient flow; thiếu nó thì 3 mục hành vi trong AGENTS.md không bao giờ được nạp.7071### Output7273```markdown74## Check Report - YYYY-MM-DD7576### Registry lệch (N)77### Link hỏng (N)78### Thiếu frontmatter (N)79### Inbox tồn đọng (N)80### Reachability (N) (gồm orphan-action: N)81### Knowledge metrics82### AGENTS.md sync (agents-md-missing / agents-md-drift)83### CLAUDE.md liên kết (claude-md-not-linked)8485✅ Không có vấn đề (nếu clean)86```8788## Mode fix8990### Sub-mode: consolidation (deep audit)9192Đọc NỘI DUNG tất cả pages. Rà soát:93- Mâu thuẫn nội dung giữa pages94- Pages chồng chéo → đề xuất gộp95- Pages lỗi thời (> 90 ngày không update) → hạ confidence hoặc archive96- Nhất quán thuật ngữ97- Workflow dependency outdated9899Trình report → user duyệt → thực thi thay đổi. Khi ghi đè nội dung page: trước khi ghi, đọc body hiện tại (bất biến: `../pk-shared/references/snapshot-contract.md`, mục "Bất biến đọc body trước khi ghi body").100101### Sub-mode: rebuild-index102103Sinh lại file dẫn xuất từ nguồn gốc (frontmatter + log), format theo spec ../pk-shared/references/schemas.md:1041. Quét knowledge/*.md → sinh knowledge/index.md (bao gồm cột Redirect từ frontmatter `redirect_to`)1052. Quét skills/*.md → sinh skills/registry.md1063. Quét workflows/*.md → sinh workflows/registry.md1074. **Tái sinh bảng consumer** trong `../pk-shared/SKILL.md`: grep ngược qua tất cả `skills/pk-*/SKILL.md`, tìm dòng tham chiếu `../pk-shared/references/<file>.md`. Với mỗi reference file, liệt kê danh sách skill đang tham chiếu → cập nhật cột "Skill tiêu thụ chính" trong bảng References của `pk-shared/SKILL.md`. Bảng consumer là bản phái sinh; rebuild-index là cơ chế tái sinh chuẩn.1085. **Regenerate AGENTS.md block** (backfill `agents-md-missing` / sửa `agents-md-drift`): ghi lại block giữa marker `<!-- personal-assistant:start/end -->` theo format canonical `../pk-shared/references/schemas.md` (mục "AGENTS.md block format"). Idempotent theo quy tắc ghi tại canonical (tạo mới / append / replace giữa marker). Chỉ động vùng trong marker, KHÔNG đụng nội dung khác của AGENTS.md, KHÔNG tạo/sửa CLAUDE.md.109110Cột Usage tái dẫn xuất từ log theo công thức ../pk-shared/references/metrics.md mục "Usage count (canonical)". Fallback: log thiếu thì giữ giá trị Usage cũ trong index; không có giá trị cũ thì để 0. (Usage được tính từ log, không phải frontmatter.) Cột Usage là cache-hint; log là SOT (xem ../pk-shared/references/sot-ownership.md).111112Cột Redirect: lấy từ frontmatter `redirect_to`. Rỗng nếu không có hoặc status không phải stub.113114### Sub-mode: restore115116Khôi phục page/bó từ `archive/`:1171. Xác định mục tiêu (slug hoặc liệt kê archive)1182. Move file về đích. KHÔNG ghi đè nếu xung đột.1193. Đổi `status` → `active`1204. Rebuild index1215. Log122123### Fix tự động vs cần duyệt124125**Tự fix (sổ sách dẫn xuất)**: registry thiếu/thừa entry so với file thật.126**Cần duyệt**: link hỏng, frontmatter thiếu, inbox tồn, gộp pages.127128## Mode evolve (schema-review)129130Tổng hợp tín hiệu "khuôn không vừa" → đề xuất diff lên SCHEMA.md.131132### Flow1331341. Đọc `schema-signals.md` (BỎ QUA promote-candidate)1352. Quét sống: đếm page/type, cụm tag, file phình (KHÔNG dùng cho glossary, xem ghi chú bên dưới)1363. Áp ngưỡng (bảo thủ: thà bỏ sót hơn báo nhiễu). Ngưỡng canonical: `../pk-shared/references/schemas.md`, mục "Bảng ngưỡng emit/act".1374. Sinh đề xuất diff1385. User duyệt1396. Migrate: bump version, rewrite link, rebuild index1407. Move tín hiệu đã batch sang "Đã xử lý" trong schema-signals.md kèm kết quả (duyệt hoặc bác). Chạy cả khi user bác đề xuất.141142### 4 loại thay đổi143144Ngưỡng đầy đủ (emit-threshold + act-threshold) tại `../pk-shared/references/schemas.md`, mục "Bảng ngưỡng emit/act".145146| Thay đổi | Tín hiệu đọc |147| --- | --- |148| Thêm page type | `no-fit-type` |149| Đổi layout (tách subfolder) | (đếm trực tiếp page active) |150| Đổi format (template hoá section) | `adhoc-section` |151| Thêm glossary | `term-repeat` |152153Ghi chú:154- query-miss là bằng chứng phụ, không tự kích hoạt thay đổi.155- Dưới ngưỡng: GIỮ tín hiệu, không xoá.156- **Glossary**: đọc tín hiệu `term-repeat` từ schema-signals.md thay cho "quét sống". pk-distill emit `term-repeat` khi xử lý nội dung (đáng tin hơn quét tĩnh).157158## Log159160```161---162timestamp: YYYY-MM-DDTHH:mm163type: knowledge-activity164source_skill: pk-lint165---166Lint [mode]: N vấn đề, M fixed167```168169## Quy tắc170171- Check mode thuần read-only.172- Fix: tách phát hiện khỏi quyết định. User duyệt nội dung, tự fix sổ sách.173- Evolve: không auto-migrate. Mọi batch gate qua user.174- Reversibility: không hard delete. Archive.