GATE-LINEEDITOR: PASS-WITH-FLAGS 8 — vá K8 chạy thật, đóng đúng blocker, 642/642 test xanh, 2 app tsc sạch, SHA-pair khớp; 0 blocker mới, nhưng có 2 MAJOR (changelog thiếu `EntityId` · `` nuốt mất hạng mục ĐÃ LƯU khi option không có trong danh sách `KhkkDetailPage.tsx:559-578` (cả hai app): `value={l.catalogEntryId ?? ''}`, danh sách option = `catalogOptions.data ?? []`, và có sẵn ``. Khi `catalogEntryId` **không khớp option nào**, trình duyệt rơi về placeholder ⇒ **dòng đã gán trông như chưa gán**. Ba ca: - (a) đang tải danh mục ⇒ nháy tạm (nhẹ); - (b) query `/catalogs/contract-catalog` lỗi mạng/5xx ⇒ **mất hẳn** tên hạng mục của mọi dòng, mà lỗi này **không có toast** (chỉ mutation mới có `onError`); - (c) hạng mục bị ngừng hiệu lực sau khi gán ⇒ **vĩnh viễn** hiển thị như chưa gán, dù DB vẫn giữ `TenHangMuc` và submit-guard vẫn cho trình (mục E.2). Trước vá, ô này luôn hiện `l.tenHangMuc`. Sau vá, dữ liệu đã lưu **biến mất khỏi màn hình** trong ba ca trên — đúng lớp bệnh "vắng mặt trông giống ổn". **Acceptance:** khi `l.catalogEntryId` không nằm trong options thì chèn một `