S161F — Fix Report: RBAC + Pagination + Rules + Runner Classify
S161F — Fix Report
Agent: Claude Code (CLI) | Ngày: 2026-03-25 PRs: 1 (#620) Manual deploys: 0 Local build: PASS (2026-03-25)
Step 0 Quotes
- OR: "VPS Operating Rules — SSOT. Version: 1.0. Enforcement: Bắt buộc cho mọi Agent."
- Layer 3/4 law: "sub_class là field bắt buộc trong system_issues. Runner/scanner tạo issue mới PHẢI gán sub_class."
- incomex-rules.md: "CẤM
--adminmerge. Lệnh đúng:gh pr merge [PR] --squash --delete-branch"
VIỆC 1: Layer 4 Detail API Fix
Problem: Directus service token returns 403 for system_issues item-level reads (aggregates work, items don't).
Fix: Use issue_type pattern matching instead of sub_class field. Fetch by issue_class (works), filter client-side by issue_type+title patterns. Cached per issue_class (2 min TTL).
Status: Code deployed. Still blocked by Directus RBAC on VPS (service token can't read items from system_issues regardless of approach). The endpoint falls back gracefully to empty results.
Remaining blocker: VPS Directus RBAC needs admin panel fix to grant item-level read for system_issues to the service token role. This requires SSH access to VPS.
VIỆC 2: Pagination
Fixed: page (default 1), limit (default 50), response includes pages = Math.ceil(total/limit).
VIỆC 3: Rules Update
Added to .claude/skills/incomex-rules.md:
- §0-AB CẤM --admin (v4.72)
- §0-AC PHÂN LOẠI TRƯỚC FIX SAU (v4.73)
- §0-AD CẤM MANUAL DEPLOY (v4.75)
- CODE DISCIPLINE (v4.75)
VIỆC 4: Runner sub_class Classify
Added classifySubClass() to dedupe.js. When runner creates new issue:
- Determines issue_class from check type
- Runs classify conditions → assigns sub_class
- Fallback = 'unclassified'
Mapping covers all 15 sub_class values from §IV.6-B.
CI Status
Nuxt 3 CI: FAIL — Counting Contract: CAT-ALL=17602 != SUM=17604
- NOT caused by S161F — same recurring CAT-ALL drift issue
- Delta = 2 records (data changed between last deploy refresh and CI check)
- Will auto-fix on next deploy (CAT-ALL refresh step runs during deploy)
Tự kiểm tra
| # | Mục | ĐẠT |
|---|---|---|
| 1 | Step 0: quotes (OR + luật + rules) | ĐẠT |
| 2 | Local build PASS | ĐẠT |
| 3 | 1 PR (#620), 1 commit | ĐẠT |
| 4 | Layer 4 API: code fix deployed | ĐẠT (RBAC blocker remains) |
| 5 | Pagination: page/limit/pages | ĐẠT |
| 6 | incomex-rules.md: §0-AB/AC/AD | ĐẠT |
| 7 | Runner classify sub_class | ĐẠT |
| 8 | 0 manual deploy | ĐẠT |
| 9 | VERIFY NUXT | Partial — Layer 4 data blocked by RBAC |
| 10 | Report uploaded | ĐẠT |