Dashboard Tổng Quan

Cập nhật: 24/05/2026 13:07 — S Talent Phase 2 PRD Full Build: 6 giai đoạn code xong (4 role, Chợ NV, admin duyệt, evidence OK/NotOK, 7 hạng, shop voucher, notifications). 155 files, tsc+build PASS. Chưa deploy — cần apply PB schema + FTP. | 24/05/2026 02:05 — GrowX Sprint 4-6 + Settings DEPLOYED LIVE: image growx-server:s25 + bundle index-BGRDHZgc.js 658KB. ImagePickerModal + GuidePage (/guide) + SettingsPage (/admin/settings quản lý API key qua PB app_settings collection) + Moodboard + Storyboard + Project Render. 10 endpoint mới + 2 collection mới (moodboards, shots) + extend projects (moodboard_id / project_render_status / final_output_url). Tab switcher "Tổng quan / Moodboard / Storyboard" trong ProjectDetail. Style injection tự động khi project có moodboard. Drag-drop shots + render all SSE. Smoke test PASS. Chờ Bi E2E test thực. | 23/05/2026 22:20 — GrowX PIVOT TALKING pipeline: bỏ Wan 2.6 + ElevenLabs IVC, dùng Edge TTS Hoài My SSML storyteller + FFmpeg loop ref_image + Ken Burns → MP4 9:16. E2E mini PASS (TTS 0.7s + FFmpeg 12s → MP4 1.53MB 22s). Còn lại deploy VPS. | 23/05/2026 12:21 — Hara App BUG-005 fix PWA update loop ✅ v1.3.260523-1221 hash 0rgRSUrT (FTP upload order + Cache-Control meta + forceUpdate bypass) | 23/05/2026 11:32 — Hara App BUG-004 fix Gemini suspended → Kimi-only ✅ v1.3.260523-1132 | Trước đó: 13/05/2026 09:01 — Hara App BUG-003 fix + UX progress bar AI analyze ✅ v1.3.260513-0855 | Trước đó: 11/05/2026 01:35 — GrowX Talking Video (khách hàng — 11/05): Fix IPv4 transport + pipeline E2E hoạt động ✅. Container không có IPv6 route → Airtable API ConnectTimeout; thêm httpx.AsyncHTTPTransport(local_address="0.0.0.0") force IPv4. Pipeline: HTML form /talking-form → upload video tham chiếu + voice text → Airtable record → Activepieces flow Gpiqobf00OPH0rGnSj9Ik (TTS OpenRouter GPT Audio Mini + Sync.so lipsync 2 + poll 13 phút) → Telegram noti. Service uploads-service rebuild + restart OK, /health 200. Bi cần upgrade Sync.so Hobbyist $5/mo (free tier 3 video đã hết khi test). Trước đó (10/05 02:27) — Việt Huy viethuynew (khách hàng — 09/05 chiều): Convert chính thức Next.js trang chủ + trang sản phẩm ✅ (65% → 80%). 50+ files mới `04-src/` Next.js 14 App Router + TS strict + Tailwind v3, 5 layout + 5 home + 10 san-pham components. Phase 1 trang chủ giữ 100% effects (HeroSlider 5s + Venn orbs + marquee + 4 pin pulse map + hover zoom). Phase 2 san-pham route /san-pham 9.25kB prerendered + useSearchParams `?linhvuc=` + 11 UX fixes bảo toàn. Build pass. ⏳ Bi test `cd 04-src && npm install && npm run dev`. Trước đó (chiều) — Việt Huy viethuynew: san-pham.html 11 fix UX deployed ✅ (60% → 65%). Hero LIGHT baby blue + 4 SVG line icon thay ảnh stock + filter chip vs checkbox + card button hierarchy + Compare drawer sticky bottom + sync số + label "Tìm phổ biến:" + sidebar 3 nhóm collapse + "Xóa tất cả" consistency + dropdown 24/48/96 SP/trang + form CTA 2 cột với 3 contact icons (1055→1357 dòng). Trước đó (sáng) — S Talent (sản phẩm riêng — 09/05): Phase 1 production LIVE tại talent.io.vn ✅ (35% → 98%) — 11 commits session này: NaN guards + wire PB data flow / userStorage.ts helper user-scoped chống data leak giữa accounts / logout button (Profile + Settings) / empty states full Home/Quest/Career/Clan / friendlyPbError() dịch lỗi PB sang tiếng Việt / Profile icons (Share/Settings/Edit) đúng vai trò / Help screen 8 sections + First-time guide popup localStorage scoped / zero-state stats wire PB (Total XP/Quest Done/Coin/Streak max) / full mock cleanup (TopBar red dot, Hero RankBadge "Thủy 3", Career peers "+23", Profile "Verified by Mentor", Shop hardcoded balance, Mentor sessions/certificates, "+23 tuần này" delta giả) → wire `getPlustalentSessions/Certificates` thật / Programs module 2 collections PB mới (`programs` public + `program_registrations` owner-only) + 3 seed mẫu (STEM/English/Career Workshop) + 1 chương trình thật **Glocal Citizen Podcast** replicate đầy đủ 10 form_fields từ Google Form Bi gửi / form auto-fill từ `pb.authStore.model` / unique constraint chống trùng / BottomNav thay tab Clan → Programs (icon calendar ở giữa) / PWA bump version 0.1.0 → 0.2.0 force service worker auto-update. **13 PB collections, 10 màn ported (Onboarding + Survey + Home + Quest + Career + Clan + Profile + Mentor + Shop + Settings + Help + Programs), no mock data leak.** ⚠️ Pre-launch: chuyển hardcode admin credentials trong `apply-programs-schema.mjs` + `seed-glocal-citizen.mjs` sang .env. Trước đó (08/05 19:30) — S Talent (sản phẩm riêng — 08/05): Brand identity update + Tài liệu nghiệp vụ 30 slides + PRD revised 12 stories + Mentor architecture clarified ✅ (30% → 35%). US-001 Brand identity done (chưa commit) — src/index.css đổi primary #0BA5C7#2586CF blue, accent #EA294A#FFC500 vàng, thêm --cyan-light: #3EFDFD + --navy: #00437F, font Poppins thay General Sans; tailwind.config.js token đồng bộ; index.html theme-color #2586CF + Google Fonts Poppins; manifest.webmanifest theme_color update; public/brand/ thêm logo-black.png+logo-white.png từ Logo STalent.zip chính thức. Build PASS 2.43s, JS 200 KB (gzip 62 KB), CSS 9 KB. ⚠️ Bi cần xuất PNG icon 192/512px từ Logo STalent.ai thay placeholder PWA. Tài liệu nghiệp vụ 01-brief/STALENT-Tai-lieu-nghiep-vu.pptx 30 slides 2.25 MB — A Tổng quan (cover/mục lục/định vị/lộ trình 3 giai đoạn) + B 5 tài khoản & user flow (Học sinh/Phụ huynh/Mentor display-only/Tổ chức/Admin) + C Sitemap & 9 màn (Onboarding/Đăng ký/Survey/Home/Quest/Profile/Career/Clan/Mentor/Shop/Settings) + D Kinh doanh (Phase 1-3 nguồn thu, Plustalent đối tác độc lập) + E Tech stack & Lưu ý; patch Mentor display-only sync Plustalent ở slides 5/7/10/20/23. PRD revised prd-loop/prd.json 12 user stories trên branch jobim/s-talent-fullbuild — US-001 done; US-002→US-012 pending (apply brand Home+Quest, Onboarding, Đăng ký, Khảo sát "công dân quốc tế", Profile+Export PDF, Career Compass, Clan, Mentor sync display-only, Shop, Settings, PocketBase wiring, FTP deploy stalent.ngoctinco.com). Scope chặt: chỉ san-pham/S Talent/04-src/ + PROGRESS.md, không đụng dự án khác. Quyết định kiến trúc 08/05: (1) Brand mới blue+vàng+Poppins thay cyan+đỏ+General Sans (2) Mentor display-only KHÔNG chat trong S Talent — chỉ sync sessions+certificates từ Plustalent (đối tác độc lập, nguồn thu Plustalent không phải S Talent) (3) Phase 1 ưu tiên go-live: Onboarding→Đăng ký→Survey→Profile radar→Export PDF (4) Phase 2: Quest/Career/Clan/Shop/Mentor build full UI lock CTA "Coming soon" (5) Khẩu ngữ TUYỆT ĐỐI không "du học" — dùng "công dân quốc tế", "chinh phục các hoạt động danh giá". PocketBase admin https://datastalent.talent.io.vn/_/, FTP 180.93.36.233:21 user stalent. Trước đó (08/05 12:13) — VNGG TECHNOLOGY (VNGG — 08/05): Website vngg.com.vn — Rebuild 5 trang body + đồng bộ visual + deploy LIVE ✅. Trong session này xử lý 3 bug nghiêm trọng liên tiếp do refactor CSS làm xóa body của 5 trang: (1) 4 trang menu chỉ hiện header+footer (san-pham/khach-hang/blog/lien-he sau khi click chỉ thấy navbar + footer, body trống) → rebuild khach-hang (583 dòng), lien-he (697 dòng), blog (542 dòng), blog/bai-mau (611 dòng) bằng 2 Builder Sonnet song song dựa SITEMAP-CONTENT.md, sync title/meta blog/bai-mau với content mới "Tổng đài ảo Cloud là gì?", deploy 17 files lên FTP 180.93.36.142 (user vngg) — tất cả URL trả 200 với content đúng. (2) Visual 4 trang rebuild lệch hẳn 2 trang gốc — Tester audit phát hiện thiếu pattern: card không có border/hover gold, thiếu .feature-card::before top gradient, thiếu .reveal scroll animation + IntersectionObserver, thiếu .hero-tech-bg animated dot grid, blog/index dùng hero sáng thay vì dark navy, blog dùng inline button style="background:#F5B91F" onmouseover thay btn-gold class. Fix toàn diện: extend assets/site.css 177 → 363 dòng append 16 class shared (.card/.feature-card/.eyebrow/.eyebrow-white/.section-h2/.section-h2-white/.hero-h1/.hero-h1.on-dark/.text-gradient/.gold-divider/.hero-grid-bg/.hero-tech-bg+@keyframes gridDrift/.hero-glow/.reveal+.is-visible/.btn-ghost-white); extend assets/site.js 77 → 122 dòng thêm initReveal() IntersectionObserver threshold 0.15 + prefers-reduced-motion fallback. 2 Builder Sonnet song song fix 4 trang: khach-hang xóa 7 redefine local + thêm hero-tech-bg + 13 vị trí reveal; lien-he xóa 9 redefine + thêm CTA hero "Gọi tư vấn ngay" + section-h2-white; blog rework hero bg-soft → navy gradient + thay 2 inline button → btn-gold; blog/bai-mau thêm boxShadow.card vào tailwind config + thay 3 inline button (CTA giữa bài + sidebar TOC + CTA cuối) → btn-gold + dùng section-h2(-white) class. Anti-pattern grep (onmouseover/style="background:#F5B91F") = 0 trên cả 4 trang. Deploy 17 files OK, 6 URL verify 200. (3) Trang san-pham/index.html bị xóa body (chỉ còn 429 dòng = head + 3 mount divs + script, 0 section) → rebuild theo SITEMAP-CONTENT.md dòng 514-781: 1 Builder Sonnet build 13 section (Nav anchor sticky / A.1 Hero Tổng đài navy + hero-tech-bg / A.2 Giới thiệu + 3 USP card / A.3 8 tính năng grid 4×2 / A.4 Quy trình 4 bước timeline / A.5 Bảng so sánh Truyền thống vs Cloud 8 hàng / A.6 FAQ 5 câu accordion / A.7 CTA Tổng đài + stats / B.1 Hero CRM badge "Sắp ra mắt" / B.2 Vision CRM mockup / B.3 6 tính năng dự kiến / B.4 Form notify CRM / Cross-sell Tổng đài + CRM 4 benefit) — file 429 → 1240 dòng (+811 dòng content), 8 CTA chính dùng btn-gold, anti-pattern = 0. Deploy 17 files (314.3 KB → 373.9 KB), san-pham trả 200 + 74.6 KB (trước chỉ 13.3 KB skeleton). 2 placeholder Bi cần xác nhận: dòng 803 "500+ doanh nghiệp tin dùng" + dòng 1103 ROI 2.3x cross-sell. Tổng artefacts: 5 trang body rebuild (3675 dòng content mới), shared CSS +186 dòng, shared JS +45 dòng, deploy 3 lần FTP, anti-pattern toàn site = 0, 6/6 URL chính verify 200. Trước đó (06/05 21:32) — Hara App (Hara Group — 06/05): [9/9] IMP-008 Đổi TK thanh toán Techcombank → ACB deployed ✅ — 🎉 JOBIM Batch [1-9]/9 HOÀN TẤT trong session 06/05. Modal thanh toán khóa học (CourseDetail.tsx:422-444): ngân hàng TECHCOMBANKACB, số TK 4141131131491386, URL VietQR TCB-4141131131-compact2.pngACB-491386-compact2.png (auto sinh QR mới với amount + nội dung CK đúng định danh học viên), chủ TK LÊ THỊ MỸ HUỆ giữ nguyên. Comment code cập nhật tương ứng. Grep toàn project sau fix: 0 occurrence Techcombank/4141131131. Build pass 5.64s, bundle index-DCbka-47.js 74KB, version 1.3.260506-2132, FTP deploy 21 files lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 21:27) — Hara App (Hara Group — 06/05): [8/9] IMP-007 Đổi "Giảng viên" → "Người dẫn đường" deployed ✅. Text update đơn giản trên trang khóa học (course detail). Audit toàn app: chỉ 1 occurrence "Giảng viên" tại app/CourseDetail.tsx:308 — fix đơn dòng từ • Giảng viên: Hara Team• Người dẫn đường: Hara Team. Không có schema field DB cho instructor (hardcoded "Hara Team" trong UI). Build pass, bundle index-CFd395Tq.js, version 1.3.260506-2124, FTP deploy 21 files lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 21:17) — Hara App (Hara Group — 06/05): [7/9] IMP-006 Khu vườn tâm trí deployed ✅. Feature redesign thay HOÀN TOÀN biểu đồ Recharts LineChart trong Mood Tracker bằng visual "Khu vườn tâm trí" 5 scene SVG inline. Component mới app/components/MindGarden.tsx (150 dòng đúng giới hạn CLAUDE.md) — props {moodScore: 1-5}, render SVG inline viewBox="0 0 400 300" responsive. 5 scene: (1) 🚨 Cần sẻ chia → cây trụi cành khô + đất nứt + mây xám trôi 12s, tông #3F3F46/#78716C (2) 💜 Chông chênh → cây ít lá vàng + 1-2 lá rơi 6s loop + mây pha hồng-tím (3) 🌱 Bình ổn → chồi non scale 0→1 grow-in 800ms + đất ẩm + mây trắng (4) 🕊️ An vui → cây xum xuê đung đưa ±2deg 4s + nắng + hoa nhỏ (5) 🌸 Hạnh phúc → hoa nở rực rỡ rung 3s + 2 bướm bay loop 4-6s + cầu vồng, tông pastel rainbow. CSS keyframes inline với prefers-reduced-motion: reduce tự tắt animation cho user nhạy cảm. Accessibility role="img" + aria-label tiếng Việt. Sửa MoodTracker.tsx gỡ import recharts + xóa <LineChart> block, thay bằng <MindGarden moodScore={latestMood} /> + grid 14 ô lịch sử (emoji mood + ngày dd/MM, ô không log border-dashed xám). Sửa vite.config.ts xóa entry vendor-recharts. Sửa package.json xóa dep recharts (npm uninstall 36 packages). Bonus tốc độ: vendor-recharts 372KB BIẾN MẤT khỏi bundle → user tiết kiệm 372KB tải về. Total chunks 16 → 15. MoodTracker chunk 27KB (bao gồm MindGarden inline), main bundle vẫn 74KB. Bundle index-OwL5EO0P.js, version 1.3.260506-2117, FTP deploy lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 21:11) — Hara App (Hara Group): [6/9] IMP-005 Sửa Safety Banner deployed ✅. SafetyBanner.tsx 1 file, 3 chỗ — cùng component dùng cho 3 variant inline/modal/sticky-top nên đồng bộ. Đổi text 1 dòng cũ "Bạn không một mình. Hãy gọi ngay nếu cần hỗ trợ khẩn cấp." → 2 dòng tách biệt: "Bạn không một mình đâu🪷" + "Hãy gọi ngay nếu cần hỗ trợ👇". Cách làm CSS: thay <h2>/<h3>/<p> đơn → <div className="space-y-1"> chứa 2 <p> riêng → mỗi câu xuống dòng riêng, khoảng cách 4px Tailwind, không dính liền. Giữ nguyên nút hotline 0931.156.213, mô tả "Đường dây Hara 24/7", nút "Gửi thư cho Ban Cố Vấn". Build pass 9.46s, vẫn 16 chunks code-split, bundle index-BpUBdKNL.js, version 1.3.260506-2111, FTP deploy 22 files lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 21:08) — Hara App (Hara Group): [4/9] IMP-003 Thay icon Mood Tracker deployed ✅. constants.ts:53-54 đổi 2 mức cảm xúc đầu: "Cần sẻ chia" 🌧️ → 🚨 (cảnh báo/đèn báo động — Bi yêu cầu alert/warning thể hiện "cần được quan tâm khẩn cấp") giữ color #EF4444 đỏ; "Chông chênh" ☁️ → 💜 (purple heart — Bi yêu cầu trái tim tím "quay về kết nối với chính mình") đổi color #F97316#8B5CF6 tím. Giữ nguyên 3 mức còn lại: Bình ổn 🌱 #008B8B, An vui 🕊️ #3B82F6, Hạnh phúc 🌸 #E57399. Build pass 16.10s, vẫn giữ 16 chunks code-split từ [5/9] (main 74KB), bundle index-B2CYPt_S.js, version 1.3.260506-2108, FTP deploy 22 files lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 21:05) — Hara App (Hara Group): [5/9] IMP-004 Tốc độ app — Performance optimization toàn diện deployed ✅. App chậm ở mọi giao diện kể cả WiFi mạnh. Lighthouse Performance Desktop: 91/100 (vượt mục tiêu 80). FCP/LCP 1.0s, TBT 0ms, CLS 0. Main bundle 1397KB → 74KB (-94.7%), từ 1 chunk thành 16 chunks. Fix 4 files: (1) App.tsx lazy load 5 view nặng (AdminDashboard/MoodTracker/Mailbox/CourseDetail/Courses) bằng React.lazy() + <Suspense> fallback "Đang tải..." (2) vite.config.ts manualChunks chia 6 vendor chunks: vendor-react 163KB / vendor-recharts 372KB / vendor-tiptap 330KB / vendor-ai (@google/genai) 257KB / vendor-pocketbase 34KB / vendor-dnd 44KB — browser cache vendor độc lập với app code (3) index.html bỏ font weight 600 ít dùng + thêm dns-prefetch PocketBase API (4) services.ts dynamic import @google/genai SDK chỉ load khi thực sự gọi Gemini fallback + thêm in-memory cache TTL 5 phút cho getCourses() + 10 phút cho getKnowledgeBase() (KHÔNG cache enrollments/mood_logs/mailbox vì cần realtime). Lazy chunks: AdminDashboard 77KB student không tải, MoodTracker 15KB, CourseDetail 13KB, Mailbox 7KB, Courses 5KB. Build pass, bundle main index-i2m-wm-5.js, version 1.3.260506-2103, FTP deploy 10 files lên app.haragroup.vn, smoke test HTTP 200 + version match. ⚠️ Cache invalidation: phải gọi courseService.invalidateCache() + knowledgeBaseService.invalidateCache() sau khi admin update data. Bi skip [4/9] làm sau. Trước đó (06/05 20:57) — Hara App (Hara Group): [3/9] IMP-002 Canh giữa slogan "Văn hóa • Tỉnh thức • Kết nối" deployed ✅. Slogan dưới logo trên màn hình Splash bị xuống dòng + lệch trái trên mobile hẹp (≤ 360px). Root cause: text-xl (20px) + tracking-widest (0.1em) cho 30 ký tự uppercase → tổng width vượt viewport iPhone SE → tự wrap. Fix CSS 1 dòng Splash.tsx:30: đổi class h1 từ text-xl tracking-widest sang text-sm sm:text-xl tracking-[0.15em] sm:tracking-widest text-center whitespace-nowrap, wrapper thêm w-full px-4. Mobile (< 640px) dùng text-sm (14px) + tracking nhẹ → vừa 1 dòng; desktop ≥ 640px giữ nguyên text-xl + tracking-widest như thiết kế gốc. whitespace-nowrap ép 1 dòng tuyệt đối. text-center defensive. Build pass 12.96s, bundle index-DeSB7oou.js 1397KB / gzip 389KB, version 1.3.260506-2057, FTP deploy 10 files lên app.haragroup.vn, smoke test HTTP 200 + version match. Trước đó (06/05 20:50) — Hara App (Hara Group): [2/9] BUG-001 Mood Tracker → Kimi AI deployed ✅. Gemini key cũ AIzaSyDv79... bị Google suspend (CONSUMER_SUSPENDED 403) → Bi quyết chuyển sang Kimi AI (Moonshot Global) thay vì xin key mới. Refactor multi-provider AI: services.ts tách AiProvider = 'kimi' | 'gemini', hàm callKimi() OpenAI-compatible POST https://api.moonshot.ai/v1/chat/completions (model kimi-k2.5, response_format json_object, KHÔNG truyền temperature vì k2.5 chỉ chấp nhận default=1), callGemini() giữ nguyên SDK @google/genai, callAi() dispatcher tự động fallback (primary lỗi → thử fallback). analyzeMoods refactor dùng callAi(prompt, {json:true}), GIỮ NGUYÊN: cache 5 phút theo latestLog.id, prefilter checkSafety() 14 keywords SOS, retry/backoff 1s/2s/4s. systemService mở rộng getter/setter: ai_provider, kimi_api_key, kimi_model, kimi_base_url, gemini_model; giữ alias getApiKey/setApiKey cho Gemini không gãy code cũ. Admin UI mới: component AiConfigModal.tsx (145 dòng) — 2 tab Kimi/Gemini, radio chọn primary, dropdown model, input API key, input Base URL, nút "Test kết nối" gọi thật API verify HTTP 200; AdminDashboard.tsx nút "Cấu hình AI" mở modal mới thay modal inline cũ. Bi cấp key sk-Q2Pa...tId đã upsert PB production qua script save-kimi-key.mjs (ai_provider=kimi, kimi_model=kimi-k2.5, kimi_base_url đầy đủ). Build pass, FTP deploy 10 files lên app.haragroup.vn, bundle mới index-gRN8QdpX.js. Verify Kimi API HTTP 200 với key thật. Bi sẽ bổ sung Gemini key fallback sau qua Admin UI. Trước đó (06/05 20:35) — Hara App (Hara Group): Hotfix [1/9] Admin trắng deployed ✅. Admin click vào Tháp Điều Khiển bị blank page — root cause: useEffect line 149 AdminDashboard.tsx để loadAllOrders (useCallback) trong deps array → mỗi lần setAllOrders re-render thì reference mới → loop vô tận → React treo trắng. Fix 3 files: (1) AdminDashboard.tsx xóa loadAllOrders khỏi deps + bọc loadData() 3 try/catch độc lập + null-guard lesson.video_file?.split (2) components/ErrorBoundary.tsx mới — class component bắt runtime error, UI tiếng Việt, nút "Tải lại", details chi tiết DEV mode (3) App.tsx bọc <AdminDashboard /> bằng <ErrorBoundary fallbackTitle="Lỗi tải Tháp Điều Khiển">. Build pass, FTP deploy 10 files lên app.haragroup.vn, bundle mới index-hDqzkdKc.js. Lần sau có lỗi sẽ hiện error UI thay vì trắng — user có nút Tải lại tự khôi phục. Trước đó (06/05 11:45) — Hara App (Hara Group — 06/05): Sprint 6 CMS Course Management deployed ✅. Admin Hara giờ tự tạo/sửa/xóa/sắp xếp khóa học không qua đội kỹ thuật. 3 Phase trọn gói trong 1 buổi sáng. Phase 1 Foundation: install 8 deps Tiptap 2.27 (react/starter-kit/image/link/placeholder) + dnd-kit (core/sortable/utilities) — pin stable, không tăng vulnerabilities; migration PB schema idempotent thêm lessons.practice_content (editor HTML) + lessons.video_url (text) + collection mới course_assets (file ≤10MB image, uploaded_by relation users, purpose enum, ref_id) admin-only write rules; sync pb_schema.json 12 collections; update types.ts (Lesson 2 field + CourseAsset interface); mở rộng services.ts thêm courseCmsService 13 method CRUD đầy đủ + reorder + getCourseTree + courseAssetService upload/getUrl/delete + helper slugify(); thêm utils/youtubeEmbed.ts parse YouTube (watch/embed/shorts/youtu.be) + Vimeo. Phase 2 Admin UI: 9 component mới app/components/course-cms/: RichTextEditor (Tiptap toolbar B/I/H1-3/bullet/ordered/link/ảnh upload qua courseAssetService, mobile scrollable toolbar) — VideoInput (2 tabs Tải video lên / Dán link YouTube-Vimeo + embed preview iframe 16:9 + validate URL) — SortableItem+SortableList (generic @dnd-kit PointerSensor+TouchSensor activation 8px, drag handle ⋮⋮, mobile touch-friendly) — LessonEditor (modal bottom-sheet mobile/centered desktop, form title/VideoInput/RichTextEditor/toggle is_free/duration, validation + confirm xóa) — TopicCard (inline-edit title blur-save, badge Free/Premium/Video/Thực hành, drag-drop lessons, nút + Thêm bài học) — CourseEditor (form info title-auto-slug + description RTE + price + thumbnail upload, 3 action button Lưu nháp/Xuất bản/Xóa, drag-drop topics, refetch tree mỗi mutation) — CourseList (grid responsive 1/2/3 col, filter tab Tất cả/Đang xuất bản/Nháp với count badge, loading skeleton, empty state VN) — AdminCourseManager (container điều phối list↔editor + breadcrumb + admin role guard currentUser.role === 'admin'); tích hợp AdminDashboard.tsx via ActionCard "CMS Khóa học (Mới)" + view 'cms'. Phase 3 Student UI: 2 component mới course-cms/student/: VideoPlayer (3 case smart: video_url hợp lệ → iframe YouTube/Vimeo 16:9 responsive / video_file<video> element / không có gì → null ẩn) + PracticeContent (render HTML Tiptap qua dangerouslySetInnerHTML — an toàn vì admin nhập, Tailwind prose styling đầy đủ heading/list/link/image/blockquote, ẩn nếu rỗng); refactor CourseDetail.tsx thêm section "📝 Bài thực hành ứng dụng hàng ngày" sau course info, nút "✓ Đã đọc xong" cho practice-only lesson (gọi progressService.markLessonCompleted), Back button fixed position; Courses.tsx không cần sửa (code cũ đủ tốt). Build pass 10.63s, bundle index-BLfbjhlL.js 1387KB (gzip 387KB), version 1.3.260506-1144, FTP deploy 10 files app.haragroup.vn, smoke test HTTP 200 + version match. Tổng Sprint 6: 11 component mới (~1500 dòng), 1 service extend + 1 service mới, 1 migration idempotent, 1 utility helper. UNBLOCK Course HEALING CẢM XÚC — 2 KH đã trả tiền chờ ~89 ngày, giờ Bi/Admin Hara tự tạo content qua "CMS Khóa học" trên Admin Dashboard không cần đội kỹ thuật. ⚠️ Bundle 1.38MB tăng từ 971KB do Tiptap+dnd-kit, chưa code-split admin chunk — chấp nhận lần này, Sprint 6.5 nên tách lazy-load AdminCourseManager để student không tải code admin. Trước đó (06/05 11:17) — Hara App: Sprint 5e BUG-Mood-429 fix + deployed. Người dùng bấm "Phân tích cảm xúc" gặp 429 từ Gemini → trải nghiệm tệ. Fix services.ts analyzeMoods: (1) Thêm analysisCache Map module-level theo latestLog.id TTL 5 phút — bấm phân tích lặp KHÔNG gọi lại Gemini, dùng kết quả cache; (2) Đổi exponential backoff 2s/4s/8s1s/2s/4s (tổng wait 7s thay vì 14s) — user đỡ chờ; (3) Đổi message lỗi cuối "Vũ trụ đang quá tải (429)...""Hệ thống đang bận, vui lòng thử lại sau 1 phút." — friendly hơn, không lộ technical detail. SOS test (#sostest) và fallback parse error KHÔNG cache (đúng nghiệp vụ). Build pass 6.77s, bundle index-sEEwRd4l.js 971KB, version 1.3.260506-1116, FTP deploy 10 files lên app.haragroup.vn. ⚠️ Gemini Free Tier gemini-2.0-flash 15 RPM/1500 RPD — nếu chạm trần thường xuyên cần nâng Pay-as-you-go (~$0.10/1M input tokens). Trước đó (05/05) — Lisa Nail App Nội Bộ (khách hàng — 05/05): IMP-038 lần 3 + IMP-039 deployed. IMP-038 lần 3 fix file Word "Phiếu lương cắt" hàng 6 (NV cuối) tràn trang 2 — root cause: ROW_HEIGHT_TW=2749 (4.85cm) × 6 + margin TB 170×2 = 16834/16838 chỉ dư 4 twips, border 1.5pt + cell padding 80 ăn hết → đẩy hàng 6 sang trang 2; fix ROW_HEIGHT_TW: 2749 → 2495 (~4.4cm) + MARGIN_TB_TW: 170 (3mm) → 567 (10mm), math 6×2495 + 2×567 = 16104/16838 → headroom 734 twips (~1.3cm) an toàn; giữ nguyên full width LR 5mm/cột 25-40-35/HeightRule.EXACT/cantSplit/font 32pt/sort. IMP-039 thêm ô thứ 5 "Chờ Đọc" (rose, icon 💬) trên dashboard BL cạnh 4 ô trạng thái (grid-cols-4 → 5) — đếm số NV (KHÔNG phải số tin) có tin admin chưa đọc qua slips.filter(sl => unreadCountsByUser[sl.userId] > 0).length; mở rộng type StatusFilter = StatusKey | 'unread' | ''; filter chain branch statusFilter === 'unread' filter list theo unreadCountsByUser; URL persist ?status=unread + sessionStorage; toggle giống IMP-036; realtime tận dụng hook useUnreadCountsByUser đã có từ IMP-037. Build pass 12.98s (PayrollPage 372.94→373.62 kB +0.68KB), deploy FTP nhanvien.lisanail.vn. Trước đó (04/05): JOBIM Batch 04/05 — 8 task deployed (IMP-035b/BUG-055/FEA-011+IMP-038/IMP-036+IMP-036b/BUG-056/BUG-057/IMP-037) + FEA-012 paused. IMP-037 badge tin nhắn chưa đọc trên list BL Admin — collection mới payroll_message_reads (composite unique month+slip_user_id+reader_id, rules ADMIN/MANAGER only), service đếm tin NV gửi có created > last_read_at, hook subscribe realtime payroll_messages, badge rose 💬N cạnh tên NV (chỉ Admin thấy), auto mark-as-read khi mở detail. Migration chạy production OK. IMP-035b tag BL admin Title Case ("Chưa Đề Nghị Duyệt"/"Đã Đề Nghị Duyệt"). BUG-055 đã deploy VPS (Sếp upload + restart, manual trigger 21:30 hôm trước áp 1.3M phạt). FEA-011 xuất file Word "Phiếu lương cắt" 6 dòng × 3 cột/trang A4, ô 4.85cm cắt rời, sort team → tên (collator vi-VN). IMP-038 fix layout Word — lề LR 10mm→5mm, ép layout: FIXED, cột Tổ 25%/Tên 40%/Số tiền 35% tổng đúng 11340 twips, padding 80/100 thủ công → bảng sát viền A4 đều cột. IMP-036 bấm 4 ô thống kê (Tổng/Chưa đề nghị/Đã đề nghị/Đã chốt) lọc danh sách + ring highlight + persist URL ?status= + sessionStorage. IMP-036b "Tổng nhân sự" thành button reset filter. BUG-056 popup menu ⋮ NV bị BottomNav cắt → render qua createPortal + position:fixed flip-up khi gần cuối viewport (BUG-037 không đủ vì overflow-hidden parent). BUG-057 dòng (4) "Cộng miễn trừ" không realtime sau duyệt — useReviewOffExemption chỉ invalidate ['attendanceReport'], quên ['payroll'] → slip cache cũ; server đã update slip đúng từ BUG-Thảo 02/05, fix 1 dòng invalidate. FEA-012 push notification BL paused chờ Sếp cấp OneSignal App ID + REST API Key. Trước đó (03/05 tối): BUG-053 CRITICAL Samsung/Android không xem được Bảng lương + BUG-055 Auto phạt vệ sinh sai giờ + BUG-049/051/052 + IMP-035 FIXED. BUG-053: NV Samsung/Xiaomi/MIUI chọn tháng 4/5 → màn hình trắng/đen, iPhone OK. Root cause: native <input type="month"> trên Android cho gõ tiếng Việt "thg 4" → silently reject → rollback tháng → state lệch → render fail. Fix: Component mới MonthSelector.tsx thay native input bằng [◀ button] + [click label "Tháng X năm YYYY ▾" mở dropdown] + [▶ button], <select> ẩn opacity-0 chỉ overlay vùng label (không che 2 nút prev/next), fontSize: 16 chống iOS auto-zoom. Áp cho cả MyPayrollPage (NV) + PayrollPage (Admin) đồng nhất. Build pass, deploy FTP 2 lần. BUG-055: Mey Mey "Quét nhà - Chưa xong" đến 20:45 VN không bị auto phạt 100k. Root cause: VPS chạy UTC, cron cũ "0 15 * * *" fire 15:00 UTC = 22:00 VN (lệch 7 tiếng), audit log 30/4–02/5 đều fire 22:00 VN — NV được "free" 7 tiếng để hoàn tất. Fix code: đổi cron "0 15 * * *""0 8 * * *" (08:00 UTC = 15:00 VN). Fix tạm: trigger thủ công /api/hygiene/run-auto-check lúc 21:30 VN → 13 auto-fail × 100k = 1.3M VND phạt áp dụng hôm nay. ⚠️ Code change CHƯA deploy VPS — cần Sếp SSH upload pb_hooks/hygiene_auto_check.pb.js + restart pocketbase, verify mai 15:00 VN cron tự fire. Trước đó (sáng late): BUG-036 nút "Đạt" vệ sinh không hoạt động + BUG-040 NV mới bị tính OFF sai trước ngày tạo TK FIXED. BUG-036 root cause: Collection hygiene_check_results field penalty_amount đặt required: true. PocketBase coi 0 là falsy → reject record có penalty_amount=0 (case "Đạt"). DB confirm: 220 record "Không Đạt" OK, 0 record "Đạt" từ khi feature live → "Đạt" CHƯA TỪNG chạy thành công. Fix: migration scripts/bug-036-fix-penalty-amount-required.mjs đổi required: true → false, min/max/onlyInt vẫn nguyên (không có rủi ro nhập số rác). Đã chạy lên PB production + verify (tạo thử pass record OK, đã xóa). Source-of-truth fea-009-create-hygiene-check.mjs synced. Không đụng frontend code — Sếp Anh không cần làm gì, vào Bảng Vệ Sinh bấm Đạt là chạy ngay. BUG-040 root cause: NV mới đưa vào Xoay ca → hệ thống gán ca từ đầu tháng → ngày trước khi NV bắt đầu làm (chưa đi làm) bị "có ca + không check-in" → tính OFF → trừ phép vượt sai. VD: Trinh Nail. Fix: attendanceReportService.ts thêm helper getAllUserStartDates() (báo cáo tổng) + getUserStartDate(userId) (single-user) đọc users.created cắt YYYY-MM-DD; guard isOnOrAfterStart(date, userStart)4 chỗ vòng lặp OFF (rotation NAIL/GOI + THU_NGAN + single-user × 2). Áp dụng đồng loạt báo cáo chấm công Admin + Bảng lương NV/Admin (cùng 1 service nguồn). Build pass 11.24s, deploy FTP nhanvien.lisanail.vn, commit 784ee00 (3 files, +126 lines). Trước đó (03/05 sáng): BUG-033 lần 2 filter Bảng lương vẫn mất khi Back FIXED. Sếp báo dù tắt mở app vẫn lỗi — root cause: forward navigation chỉ mang month, Back không có filter để khôi phục. Fix PayrollPage.tsx:604 mang TOÀN BỘ params (branch/team/search/userId) sang trang detail; PayrollDetailPage.tsx:279 Back ưu tiên navigate(-1) để dùng history (URL trước đó đã có đầy đủ filter), fallback sang /admin/payroll?<params>. Build pass 11.21s, deploy FTP nhanvien.lisanail.vn, commit 9066ae3 (2 files, +19 lines). Trước đó (03/05 đêm khuya): BUG-039 CRITICAL Lượt PV không đồng bộ check-out FIXED + cleanup. Vấn đề: KTV check-out trên Chấm Công ("Hoàn tất") nhưng Lượt PV vẫn TRỐNG thay vì ĐÓNG; Admin/Thu Ngân bấm đóng thủ công cũng không được → kẹt TRỐNG vĩnh viễn; regression từ 01/05 ảnh hưởng TẤT CẢ CN. Root cause: BUG-032 (28/04 commit 79f06cf) thêm tính năng force-open KTV qua marker reason='manual_reopen' trong session_closures; logic getClosuresWithForceOpen() ưu tiên manual_reopen ghi đè closure → khi force-open xong rồi check-out → DB có 2 record (marker + closure) → marker thắng → kẹt TRỐNG. Fix code: sessionService.ts:417-455 hàm closeKtvForToday() giờ xóa hết stale manual_reopen markers trước khi tạo closure record mới (code đã có sẵn từ session trước, deploy LIVE qua FTP build commit 55be926 IMP-032). Migration cleanup: Cải tiến scripts/bug-039-cleanup-manual-reopen.mjs thêm safe-mode (chỉ xóa markers của KTV bị kẹt — có cả marker + closure khác cùng ngày — bảo vệ force-open hợp lệ chưa check-out). Đã chạy lên PB production: 01/05 dọn 76 markers stuck; 02/05 + 03/05 không cần dọn (markers còn lại là force-open hợp lệ). Total cleanup: 76 markers, 0 lỗi. Trước đó (03/05 khuya muộn): IMP-032 Khóa BL tháng cũ cho NV từ ngày 10 deployed. Yêu cầu: NV xem được Bảng lương tháng trước đến hết ngày 9 tháng sau; từ ngày 10 → khóa, chỉ xem tháng hiện tại; Admin không ảnh hưởng. Implementation: MyPayrollPage.tsx thêm helper previousMonth() + minMonthForEmployee() (≤9 → tháng trước; ≥10 → tháng hiện tại). <input type="month"> kẹp min/max để HTML5 picker tự ẩn tháng ngoài phạm vi. useEffect clamp month state khi vượt phạm vi (case app mở qua mốc đêm 9 → 10 phải tự nhảy về tháng hiện tại). Ghi chú UX khi chỉ còn 1 tháng: "ⓘ Bảng lương các tháng trước đã được khóa. Liên hệ Admin nếu cần đối chiếu." IMP-033 (xóa BL tháng cũ khỏi DB) hoãn theo yêu cầu Sếp Anh — code đã viết (PayrollPage admin clamp + PB hook payroll_cleanup.pb.js cron 0 3 1 * * xóa slip + adjustments < cutoff = month-2 + endpoint /api/payroll/run-cleanup admin test) đã rollback khỏi commit. Build pass 11.21s, deploy FTP nhanvien.lisanail.vn, commit 55be926 (1 file, ~30 lines). Trước đó (03/05 khuya): FEA-011 v2 fix Admin không thấy yêu cầu của NV + UI pending list + badge nguồn deployed. Bug: NV Mana (Bến Thành, NAIL) gửi 3 yêu cầu thưởng/phạt nhưng Admin không thấy trên Bảng lương chi tiết. Root cause: Collection payroll_adjustments tạo bằng SDK thiếu autodate fields created/updated (PB 0.23+ KHÔNG tự thêm như version cũ) → service query sort: '-created' trả về 400 silent → list rỗng. Verify qua superuser: 3 record tồn tại đúng trong DB. Fix: Script bug-fea011-add-autodate.mjs chạy production thêm 2 field autodate vào collection (logs xác nhận: id, month, user_id, payroll_slip_id, type, amount, reason, status, submitted_by, reviewed_by, reviewed_at, review_note, attachments, created, updated). setup-payroll.mjs sync source-of-truth. UI Admin mới: Block "Yêu cầu thưởng/phạt chờ duyệt (N)" nằm dưới block miễn phạt OFF — render PendingAdjustmentCard per yêu cầu, focused vào Duyệt/Từ chối, badge tím "NV gửi" / xám "Admin thêm" phân biệt nguồn (dựa vào employeeUserId prop), modal nhập lý do từ chối. AdjustmentApprovalCard trong list dòng (11)/(12) cũng thêm badge nguồn tương tự. Build pass, deploy FTP nhanvien.lisanail.vn, commit 234ef7c (6 files, +340 lines). Trước đó (03/05 tối): BUG-044 + IMP-031 Đồng bộ Bảng lương NV với Admin deployed. Root cause BUG-044: Admin lấy số ngày OFF từ useRealtimeReport (tính realtime từ attendance_records), NV chỉ đọc slip.offDaysActual (cached) → lệch khi chấm công thay đổi sau lần tính cuối (VD Huỳnh Như: Admin 4 ngày, NV 2 ngày). Fix: attendanceReportService.ts thêm buildMonthlyReportForUser(month, userId) single-user variant (bảo mật + băng thông). usePayroll.ts thêm hook useMyRealtimeReport. MyPayrollPage.tsx overlay realtime qua overlayRealtimeFoundation. Block "Thông số cơ bản" (4 mục cũ) → 6 mục A/B/C/D/E/F: A Lương cơ bản, B OFF phép, C OFF thực tế + danh sách ngày cụ thể với tags ([Cuối tuần]/[Trùng lịch]/[Off Lố]), D Ngày phạt tuân thủ, E Ngày miễn phạt (readonly cho NV), F Đơn giá 1 ngày công. Toàn bộ 15 dòng lương + confirm/revoke đều dùng liveSlip overlay. Slip locked vẫn freeze (đúng nghiệp vụ). Build pass, deploy FTP, commit 5a32bb9 (3 files, +377 lines). Trước đó (03/05 chiều): BUG-041 Fix nút "Xác Nhận Đúng" + Hủy xác nhận 5 ngày deployed. Root cause: PB rule payroll_slips.updateRule chỉ cho ADMIN/MANAGER → NV bấm fail silent 403 không có toast nên trông như "không phản hồi". Fix: Script bug-041-fix-payroll-update-rule.mjs mở rule (role=ADMIN||MANAGER) || (user_id = auth.id) cho NV update slip của chính mình. setup-payroll.mjs sync source-of-truth. Service thêm revokePayrollConfirmation (status=draft, confirmed_at=null). Hook useRevokePayrollConfirmation. MyPayrollPage.tsx toast lỗi tiếng Việt + nút tách 3 trạng thái: Xác Nhận Đúng / Hủy xác nhận (trong 5 ngày) / "Đã xác nhận, không thể hủy" (quá 5 ngày), hiển thị deadline "Có thể hủy đến DD/MM/YYYY". PayrollPage.tsx admin list NV thêm badge xám "Chưa xác nhận" / xanh "Đã xác nhận" / tím "Đã chốt". Computed canRevoke = (now - confirmed_at) < 5 ngày — không cần lưu DB. Build pass 11.53s, deploy FTP, commit fd267eb (6 files, +1193 lines). Trước đó (03/05 sáng): FEA-011 NV gửi yêu cầu thưởng/phạt + Admin duyệt deployed. Phía NV trên app điện thoại Bảng lương thêm 2 nút "Yêu cầu thưởng" (xanh lá) + "Yêu cầu phạt" (cam) sau mục miễn phạt OFF — nhập số tiền + lý do, gửi nhiều lần không giới hạn, lịch sử badge "Chờ duyệt/Đã duyệt/Từ chối". Phía Admin Bảng lương chi tiết: dòng (11) Thưởng và (12) Phạt giờ expandable ▸ — list từng khoản với 4 thao tác Duyệt/Từ chối/Sửa/Xóa, modal nhập lý do từ chối, nút "+ Thêm khoản" cho admin tự ghi nhận (auto-approved không cần duyệt thêm). TỔNG (11)/(12) auto-sync vào slip qua silentSaveAdjTotal (không cần nhấn Lưu). 3 component mới: AdjustmentRequestForm + AdjustmentApprovalCard + AdjustmentList. Service thêm updateAdjustment/deleteAdjustment + option autoApprove cho createAdjustment. Hooks useUpdateAdjustment/useDeleteAdjustment. Backend không cần migration — collection payroll_adjustments đã setup từ trước. Build pass 12.03s, deploy FTP nhanvien.lisanail.vn, commit 96ff1e6 (7 files, +1127 lines). Trước đó (02/05 chiều): BUG-Thảo "Cộng miễn trừ" auto-sync deployed. Vấn đề: duyệt đơn miễn phạt OFF → mục (4) "Cộng miễn trừ" trong bảng lương chi tiết KHÔNG cộng tiền ngày đó, phải bấm "Tính lại lương" mới update. Nguyên nhân: slip.exemption_days chỉ tính 1 lần lúc tạo bảng lương, reviewOffExemption chỉ đổi status đơn + xoá phạt chấm công, không cập nhật slip. Fix: attendanceReportService.ts:reviewOffExemption thêm block sau review — đếm lại đơn approved của NV trong tháng → tìm slip → update exemption_days + exemption_credit = days × daily_rate, tôn trọng manually_edited.exemptionDays/exemptionCredit (BUG-038 camelCase keys), bỏ qua slip locked. Migration scripts/imp-030-reconcile-exemption-days.mjs 1-shot fix slip cũ — chạy 2026-04: Thảo Tân Định 0→2 ngày = +740.740₫. ⚠️ Lần đầu chạy bug ở key snake_case → wipe 4 manual edits → restored: Ngân 4.574.076₫/Uyên 2.892.861₫/Trinh 3.714.282₫/Trinh Nail 5.999.994₫. Phát hiện thêm: Thảo Tân Định có 2 đơn approved CÙNG ngày 20/4 (duplicate) → slip cộng 2 ngày × 370.370 = 740.740₫. Sếp cần review xem có muốn reject 1 đơn không (fix mới sẽ tự động trừ về 1 ngày khi reject). Build 11.9s pass, FTP deploy nhanvien.lisanail.vn. Trước đó (sáng cùng ngày): JOBIM Batch 8 deployed — 6 task. BUG-038 nút "↺ reset" trên ô đã chỉnh tay (revert giá trị tự động + persist ngay) + migration field manually_edited JSON vào payroll_slips + usePayroll.ts overlay tôn trọng flag không ghi đè giá trị admin sửa tay (8 fields). BUG-027 re-fix dòng (3) "Trừ vi phạm chấp hành" hiển thị GROSS — đổi compliancePenaltyDays dùng totalViolationDays (gross) thay penaltyOffDayTotal (net), dòng (4) exemptionCredit offset miễn phạt riêng (VD: 4 vi phạm + 3 miễn → -4×rate + +3×rate). BUG-033 filter bảng lương persist khi Back từ detail (đã sẵn useSearchParams, verify pass). BUG-037 popup menu ⋮ Quản lý NV flip lên trên khi gần cuối viewport — getBoundingClientRect() check 220px còn lại → bottom-8 thay top-8. IMP-027 Filter 3 cấp cho "Tính lương" — dropdown chọn NV cụ thể, sync URL param userId, auto-clear khi đổi CN/team out-of-scope, payrollService thêm filter userId vào workingUsers chain, confirm dialog hiện rõ tên NV. IMP-029 Nút "Xuất Excel" trên bảng lương — dùng xlsx v0.18.5 client-side, dòng tiêu đề ghi rõ filter (CN/Team/NV/Tháng), bảng STT|Tên NV|Thực nhận, dòng TỔNG SUM, format VND #,##0 đ, merge title row, filename slug-hoá Bang_luong_Lisa_Q5_Nail_04-2026.xlsx. Build pass mỗi commit ~14s, deploy FTP nhanvien.lisanail.vn thành công. Trước đó (30/04 21:00): Phase 3 Mục 3 LIVE — Thelisa Proxy PB hook. Token Thelisa đã giấu khỏi bundle FE, đi qua pb_hooks/thelisa_proxy.pb.js, proxy endpoint /api/thelisa/payroll-summary. Fix 3 bug JSVM (scope, URLSearchParams, byte decode). Refactor thelisaApi.ts fetch direct → pb.send. Verify: Manager 200 OK, KTV/Lễ tân 403, expired 401. Hotfix PayrollPage alert message tiếng Việt. Bundle thelisaApi-B0rrO-hg.js 1.4KB clean. Trước đó (chiều): DEPLOY-001 fix bug pb_hooks/hygiene_auto_check.pb.js trên VPS production — upload 2 file hook qua aPanel, fix 2 bug JSVM scope (function + constant không visible trong handler), đổi console.log → $app.logger(). Endpoint trả errors=0, cleanup 53 record test (5.3M VND phạt oan). Cron 15h live. ⚠️ Không trigger thủ công trước 15h. Tiếp theo (09:10) — Việt Huy viethuynew (khách hàng, 60%): Polish bản test theo feedback Bi. Logo chính thức Bi cấp file JPEG (843×596 nền xám) — Python script luminance threshold 200 + edge anti-alias smoothing → nền trong suốt; auto-crop 518×175 + padding 4%/10% cân đối → 558×209 PNG; sinh logo.png (navy) + logo-white.png (silhouette trắng footer) + backup logo cũ. §2A 3 thẻ lĩnh vực thay 3 ảnh Unsplash → ảnh local Bi cấp chan-doan-y-te.jpg / thu-y-chan-nuoi.jpg / an-toan-thuc-pham.jpg. Footer bỏ tagline "Science for life". Eyebrow §2A "Lĩnh vực hoạt động" giảm tracking-[0.24em]0.08em chữ khít. Đóng gói lại viethuy-test.zip 5.6MB (18 entries) sẵn upload VPS test. Trước đó (28/04) — Lisa Nail App Nội Bộ (khách hàng, 99%+ LIVE): JOBIM batch 7 task deployed. BUG-032 Admin/Thu Ngân mở thủ công KTV bị ĐÓNG hoạt động trong MỌI trường hợp (về sớm, OFF, lỗi, meal break) qua marker manual_reopen trong session_closures bypass tất cả auto-close rules. BUG-034 sửa logic exempt earlyTardinessCovered (bỏ so sánh giờ sai — chỉ cần đơn approved là miễn) + Popup miễn phạt phân biệt rõ "Phạt tuân thủ — Đi trễ" vs "Phạt tuân thủ — Về sớm" với 2 checkbox độc lập, ngày, số tiền, màu nền cam/xanh. BUG-035 SessionRow main board hiện 🍚 NGHỈ ĂN + countdown + giờ kết thúc thay vì "ĐÓNG" trống; tag amber "Xong lượt ăn" cho KTV đang phục vụ + đăng ký nghỉ ăn. FEA-009 Phạt vệ sinh + Kiểm tra Thu ngân — collection mới hygiene_check_results đã tạo trên PB remote, service immutable result/penalty (anti-fraud), HygieneCheckPanel với nút "Đạt"/"Không Đạt" + form miễn phạt, cron 15h auto-fail tasks chưa kiểm tra/chưa xong, tích hợp Bảng lương dòng (12) "└ Phạt vệ sinh: XXXđ" realtime; quyền: cashier miễn chỉ hôm nay, admin mọi lúc. IMP-024 phát hiện code multi-cashier đã có sẵn từ 25/04 (N records) — chỉ thêm prop addLabel theo team ("Thu Ngân"/"thợ Gội"/"KTV"). IMP-025 Tab Nhanh popup KTV trống thêm section "DỰ KIẾN CÓ CA" 🔵 với cửa sổ tính từ ca + đơn (kể cả pending) — append isOff+tardyInfo vào MatrixKtvColumn, parseTardyInfo + computeExpectedWindow handle late/early/off/default. IMP-026 rotation 3 chỗ (ScheduleRow, RotationPage, RosterManager) dùng nickname || fullName (bỏ logic last-word sai). 5 commits riêng, build pass 1m 10s, FTP deploy 183 files. Còn lại: Sếp Anh SSH VPS thêm crontab 0 15 * * * hygiene-auto-check-cron.mjs. S Talent (sản phẩm riêng, 30% — sáng cùng ngày): REFACTOR feature-based architecture. Tách src/components/src/features/ (8 folder độc lập home/quest/profile/career/clan/mentor/shop/settings) + src/shared/ (ui + layout). HomeScreen 405 dòng → 53 dòng + 4 component con (HeroPanel/StreakStrip/QuestPreview/CareerPreview). Mock data + radar geometry tách riêng. App.tsx 9 dòng + routes.tsx riêng. tsc clean, dev server OK localhost:5174. Tiến độ 25% → 30%. Mỗi feature độc lập, ít conflict git khi nhiều dev làm song song. App Plustalent (Plustalent, 99% LIVE — sáng cùng ngày): FEAT-ADMIN-PDP-DETAIL-VIEWER + FIX-ACTION-PLANS-JSON. Trang Admin → Theo dõi PDP — modal chi tiết cặp Mentor-Mentee giờ hiển thị FULL nội dung: tab "Nhật ký 6 phiên" có cross-reference "Mentor đã giao từ Phiên N-1", badge tháng, achievements/next_actions/extra_notes, thumbnail ảnh bằng chứng + lightbox full-screen, footer timestamp; tab "Kế hoạch PDP" PlanContentRenderer thay thế hoàn toàn JSON.stringify — goals card có badge KPI + tên sách, action_plans card per goal với mini-cards items (status badge / deadline / detail_target / expected_result / support_needed), roadmap monthly_actions grouped by goal, generic fallback render array-of-object thành mini-cards thay vì JSON dump. Files mới: CheckinCard.tsx, PlanContentRenderer.tsx. Build pass, FTP deploy 11 files OK (bundle index-Ci1qCxyq.js).

Thực trạng Backend — "Bao nhiêu dự án thực sự chạy được?"

GO
7
LIVE — Đang chạy thật, có domain
DB
6
Có backend thật, chưa deploy
UI
8
Mockup / UI tĩnh (không backend)
--
6
Chưa code / chỉ có brief
25
Tổng dự án
6
Đang LIVE
8
Có backend thật
8
Mockup / UI tĩnh
5
Chưa code
7
Tích hợp Gemini AI
Thực trạng Backend
25 dự án
LIVE (chạy thật) 6
Backend thật 7
Mockup / UI tĩnh 8
Chưa code 6
Tiến độ dự án (top 14)
VAM
100%
Lisa Nội Bộ
99% LIVE
PVT
97%
Gia Phả
95%
Việt Huy Web
95% Mockup
Plustalent HR
92% LIVE
PT Mentoring
99% Backend
VH Nội Bộ
85% Mockup
VAACA
78% LIVE
Phương Anh
90% LIVE
Diệp Dương
65% Code
Talent App
65% Mockup
AI Brainstorm
65% Backend
AI Plan
60% Mockup
KH
Dự án Khách hàng (17)
LIVE — chạy thật, có domain
Backend thật — có DB, chưa deploy
Mockup — UI tĩnh, data cứng
Chưa code — chỉ brief/strategy
Dự án
Tech Stack
Tiến độ
Loại hình
Trạng thái
Việc tiếp theo
CRM Du lịch (PVT)
Phương Vy Tour
Vite + React 19 + Express + MySQL 8
pvtcrm.ngoctinco.com
99%
LIVE
Deploy 21/05 12:44 commit 7afc357 (Security CORS+rate-limit, Tour tabs API, UX mobile R1+R2). API healthy + bundle index-n3SJxwEl.js live
Cài đặt hệ thống (info công ty, payment) + JWT httpOnly sprint sau
App Nội Bộ (appnoibo)
Lisa Nail
Vite + React + PocketBase
nhanvien.lisanail.vn / datanoibo.lisanail.vn
99%
LIVE
25/05: BUG-061 fix #5 root cause (setState cascade + createImageBitmap off-thread + upload 30s timeout). Chờ NV test camera.
NV test camera + Phase 5 Advanced
Form Góp Ý Tết (gopy)
Lisa Nail
Vite + React + PocketBase
datagopy.lisanail.vn
MVP
LIVE
MVP
Thêm auth admin
Website HR
Plustalent
HTML + CSS + JS
plustalent.ngoctinco.com
95%
LIVE
Deployed
QA visual + backend + CMS
App Mentoring PWA
Plustalent
Vite + React + PWA
PB production
99%
Backend thật
16/16 Prompt DONE 19/05
GĐ2: cron nhắc, auto-match, Form B/C chờ Quyên
Website KHKT (bản cũ)
Việt Huy
HTML + CSS
95%
Mockup
17 trang + 3 CL + KV
KH chọn option → code mới
Website KHKT (concept mới)
Việt Huy — VietHuy1
Chưa chọn
5%
Chưa code
Khảo sát template
Khảo sát + tổ chức folder + tách CSS
App Nội Bộ (NB)
Việt Huy
Vite + React + PocketBase
85%
Mockup
Deployed Netlify
Kết nối PB cho Sales
Website Hàng không
VAACA
Vite + React + TS + Tailwind
vaaca.vn / api.vaaca.vn
78%
LIVE
UI sáng +25%
Upload tài liệu thật
Phương Anh Co
Vite + React + PocketBase
PocketBase
90%
LIVE
MySQL→PB migrated
Test E2E + upload ảnh thật
Website Nội thất Gỗ
Diệp Dương
HTML + Foxiz CSS
Static
65%
Code
7 trang HTML
QA visual → responsive → deploy
Website B2B Cân
Sakura Scale
Vite + React + SQLite
SQLite local
55%
Backend thật
Anti-AI + SQLite
Kết nối frontend → API
App PWA Cà phê
Viva Star
Vite + React + PWA
50%
Mockup
Demo xong
Backend thật
Vòng Xoay May Mắn (Mini-game GO)
Viva Star Coffee
Vite 6 + React 19 + TS
PocketBase (datagiapha)
98%
LIVE
15/05 22:33 — Nâng cấp 3 bộ VIP (Togo/Coffee/Cây Cà Phê) — DB migrated, FE deployed
vxmm.ngoctinco.com — ⚠️ Bi upload hook mới + phân lại 5 SĐT VIP cũ
Website Tiếng Anh
BHV English
Chưa chọn
5%
Chưa code
Có brief
Brief → PRD → code
Hara App (Companion Ecosystem)
Hara Group
Vite + React 18 + TS + PWA
PB data.haragroup.vn + Kimi/Moonshot + Safety Filter
99%
LIVE
23/05 12:21 — BUG-005 fix ✅ PWA update loop: FTP upload order + Cache-Control meta + forceUpdate bypass HTTP cache — v1.3.260523-1221 hash 0rgRSUrT
Bi test bấm "Cập nhật ngay" trên LIVE → confirm hết loop.
Bwash
Bwash
Chưa chọn
5%
Chưa code
Có ghi âm brief
Transcript → PRD → code
Viva System
Viva Star Coffee
Vite + React 19
Supabase (Singapore)
95%
LIVE
23/04 15:38 — Polish + PWA + BottomNav LIVE
vivacrm.ngoctinco.com — Chờ Resend key + VAPID
Website VNGG TECHNOLOGY
VNGG TECHNOLOGY
Static HTML + Tailwind CDN + JS partials
FTP 180.93.36.142 (vngg.com.vn)
80%
LIVE
08/05 12:05 — 5/6 trang body rebuild + visual đồng bộ + deploy
vngg.com.vn — Bi xác nhận placeholder (logo KH, hotline, số liệu, Maps embed) → swap ảnh thật
SP
Sản phẩm riêng (9)
Sản phẩm
Tech Stack
Tiến độ
Loại hình
Trạng thái
Việc tiếp theo
Gia Phả
Gia phả gia đình
Next.js + PB + Gemini PWA
datagiapha.ngoctinco.com
95%
Backend thật
Sẵn sàng
Fix QA → launch
VAM
Hướng nghiệp AI
Vite + Express + Gemini
SQLite local
100%
Backend thật
Hoàn thành
Mở rộng DB trường học
Talent App
TALENT+ Gamified Dashboard
Vite + React 19 + PB
65%
Mockup
UI Demo
Kết nối PocketBase
S Talent
PWA HS cấp 3 + SV — SAI Score gamified
Vite + React 18 + TS + Tailwind + PWA + PB
talent.io.vn
60%
CODE DONE
24/05 13:07 — Phase 2 PRD Full Build (4 role, Chợ NV, 7 hạng, shop voucher)
Apply PB schema + FTP deploy + test E2E
AI Brainstorm
Công cụ brainstorm AI
Vite + PB + Gemini
data.ngoctinco.com
65%
Backend thật
Đang làm
Validation + error handling
AI Plan
Lập kế hoạch AI
Vite + Gemini
60%
Mockup
Đang làm
Kết nối PocketBase
Phát Triển Bền Vững
Landing page bán hàng PTBV
Next.js + Tailwind v4
55%
Code
Đang tiến hành
QA visual → chờ logo → deploy
AI Tài Chính
Quản lý tài chính AI
Vite + PB + Gemini
datatroly.ngoctinco.com
50%
Backend thật
Đang làm
Implement 5 pages
WebCV
CV cá nhân online
Vite + React
10%
Chưa code
Mới bắt đầu
Implement từ design
AI POS
Point of Sale AI
Chưa chọn
0%
Chưa code
Chưa bắt đầu
Chưa bắt đầu
!
Cảnh báo & Gợi ý
Việt Huy deadline 14/05/2026 — 44 ngày còn lại. Bản cũ 95% (17 trang HTML), concept mới (VietHuy1) vừa bắt đầu (5%).
VietHuy1 (concept mới) vừa được thêm — cần khảo sát template + tổ chức lại folder + tách CSS.
Phát Triển Bền Vững chờ logo từ designer — code Next.js 17 components xong, build OK. Chờ logo để deploy.
5 dự án chưa code (VietHuy1, BHV English, Bwash, webcv, AI POS) — cần ưu tiên lọc bỏ hoặc bắt đầu. Hara App đã chuyển sang nhóm có code (35%).
6 dự án đang LIVE: Lisa Nội Bộ (nhanvien.lisanail.vn), Lisa Góp Ý (datagopy.lisanail.vn), Plustalent HR (plustalent.ngoctinco.com), VAACA (vaaca.vn), Hara App (app.haragroup.vn), VNGG TECHNOLOGY (vngg.com.vn). S Talent Phase 2 rebuild — CODE DONE, chưa deploy.
Ưu tiên deploy: PVT (97%) + Gia Phả (95%) — 2 dự án gần xong nhất, đã có backend thật, chỉ cần test + deploy là lên production.
NK
Hoạt động gần nhất
24/0513:07
🚀
SP
S Talent
Phase 2 PRD Full Build CODE DONE. 6 giai đoạn code xong: 4 role (HS/PH/GV/ĐT), Chợ Nhiệm Vụ 3 khu, tạo+duyệt NV, nộp minh chứng OK/NotOK, XP+Xu thưởng, 7 hạng hành tinh, Shop voucher thật, notifications. 155 files, 22+ PB collections, tsc+build PASS. Chưa deploy — cần apply PB schema + FTP + test E2E.
24/0502:05
🎬
SP
GrowX Studio
Sprint 5+6 DEPLOYED LIVE — Moodboard + Storyboard + Project Render. Bi yêu cầu "hoàn thành tất cả rồi deploy, moodboard giữ tiếng Anh" → autonomous mode. Delegate 2 Builder Sonnet song song (BE 472s/58 tools + FE 345s/39 tools) gộp Sprint 5+6. BE 5 file mới: lib/style.ts 102d (getProjectStylePrompt cache 60s tự inject keywords+palette vào prompt), routes/moodboard.ts 255d (GET/PUT/POST generate-key-visual), routes/shots.ts 212d (CRUD + reorder), routes/projectRender.ts 165d (POST render + GET SSE stream), workers/projectRenderJob.ts 258d (BullMQ queue chạy lần lượt từng shot workflow + ffmpeg -c copy concat lossless). 13 file modified: handlers (imageGen/videoGen/talkingStillHandler) inject style từ projectId, workflowExecutor thread projectId? qua NodeHandlerCtx, queue.ts thêm projectRenderQueue. PB schema mới: +2 collection moodboards (palette JSON, style_keywords, ref_image_ids JSON, key_visual_url) + shots (project_id, order_idx, name, duration_sec, prompt, workflow_id, output_url, status) + extend projects 3 field mới (moodboard_id, project_render_status, final_output_url). FE 12 file mới: MoodboardTab.tsx 159d + 3 component con (PaletteEditor / RefImagesPicker / KeyVisualEditor), StoryboardTab.tsx 200d + 5 component con (ShotCard dnd-kit / AddShotModal / ShotDetailModal / RenderDrawer SSE / StoryboardToolbar), 2 API client (moodboardApi / shotApi) + constants/moodboard.ts (DEFAULT_PALETTE + 10 STYLE_KEYWORD_SUGGESTIONS) + types mới. ProjectDetail.tsx 175d thêm tab switcher "Tổng quan / Moodboard / Storyboard". Drag-drop reorder shots dùng @dnd-kit/sortable đã có sẵn. Refactor pb.ts: 548→231 dòng, tách pbSchema.ts 323d để tuân thủ ≤500 absolute. Decision autonomous: Moodboard giữ tiếng Anh (Bi xác nhận), Style injection mặc định ON, Key Visual generate thủ công (nút riêng), ffmpeg -c copy concat, extend projects thay vì v2, bỏ Sprint 7. Deploy s25: tar src → /tmp/buildgrowx → docker build → recreate container qua /tmp/growx-run.sh → upload app-dist qua alpine --user 0. Image growx-server:s25 + bundle index-BGRDHZgc.js 658KB (gz 204KB). Smoke test E2E PASS: /api/health 200 ✓, schema auto-migrate ✓, PUT moodboard với palette+keywords ✓, GET moodboard persist OK ✓, POST shot auto order_idx=1 ✓, GET shots ✓, DELETE shot ✓. Cuối: 16 file dirty + 22 untracked chờ Bi xác nhận commit gộp Sprint 4-6 thành 1 commit hay tách. tsc + vite build PASS sạch cả BE + FE. ⏳ Bi vào project bất kỳ → 3 tab mới + tạo moodboard với palette + tạo 3-5 shot → render toàn bộ.
24/0501:07
🔒
SP
GrowX Studio
Sprint 4 + Settings page DEPLOYED LIVE. Delegate 2 Builder Sonnet song song. Sprint 4: ImagePickerModal (components/ImagePickerModal.tsx 125d + UploadTab 128d + LibraryTab 74d) — click placeholder trong ImageInputNode mở modal 2 tabs Upload/Library; GuidePage (pages/GuidePage.tsx 152d + GuideSections 171d + GuideSteps 166d) route /guide 6 section hướng dẫn vẽ workflow + nav "Hướng dẫn". Settings (Option A — PB-based): Collection mới app_settings (key/value/description/is_secret) với 5 default rows seeded (openrouter_key, elevenlabs_key, image_gen_model, video_gen_model, cost_tracking_enabled). BE: lib/settings.ts 111d (getSettingValue cache 60s + fallback env) + routes/settings.ts 176d (GET mask secrets / PUT / POST test connection). Refactor 5 worker files (openrouter / elevenlabs / wan / imageGen / talkingStillHandler) — đọc key qua getSettingValue('openrouter_key', 'OPENROUTER_API_KEY'), fallback env nếu DB rỗng. FE: pages/admin/SettingsPage.tsx 141d + SettingRow.tsx 120d (mask secret + show/hide + test connection inline) + lib/settingsApi.ts 26d + constants/settings.ts 33d. Route /admin/settings + nav "Cài đặt". Save chỉ PUT keys đã sửa (dirty tracking). Image growx-server:s24 + bundle index-Jx7raIdC.js 638KB. Smoke test PASS: auth 401 → 200 with token, test openrouter "Kết nối thành công" (env fallback vì DB rỗng). Backward compat: DB rỗng → workers tự dùng env var hiện tại. ✅
23/0522:20
🎤
SP
GrowX Studio
PIVOT TALKING pipeline: bỏ Wan 2.6 lipsync (model OpenRouter ignore audio input, tự generate AIGC Alibaba — forensic xác nhận) + ElevenLabs IVC (tiếng Việt chất lượng trung bình). Stack mới: Microsoft Edge TTS (free, npm msedge-tts@2.0.5) voice vi-VN-HoaiMyNeural (nữ Hoài My) + SSML style storyteller (rate -8% truyền cảm) + FFmpeg loop ref_image + Ken Burns zoom 1.0→1.15 → MP4 9:16 1080×1920. Đã code edgeTts.ts 140 dòng + talkingStill.ts 198 dòng + refactor renderJob.ts 311→396 (gỡ wan/elevenlabs imports + chunking, thêm idempotency skip nếu file ready, fix PB URL field bug bằng buildPublicUrl(PUBLIC_BASE_URL+...)). UI: dropdown Giọng đọc + Phong cách thay upload IVC. E2E mini local PASS — TTS 0.7s + FFmpeg 12s ra MP4 1.53MB 22s. tsc clean cả server + app, vite build PASS 426KB. Sync.so SKIP MVP vì no free tier + lipsync-2 không nhận static image. Còn lại: deploy VPS rebuild Docker (npm install msedge-tts) + E2E test scene thực.
15/0522:33
🎭
KH
Vòng Xoay May Mắn
Nâng cấp 3 bộ VIP (giải lớn): Prize #3 "Quyền Sở Hữu & Khai Thác 01 Cây Cà Phê" → tier=big. Thêm field prize_id (relation) vào vxmm_vip_phones, vip_prize_id vào vxmm_players. 5 SĐT VIP cũ gán tạm về Togo. Hook mới có: (1) register-player cache vip_prize_id lên player, (2) spin dùng exact prize thay vì random big, (3) /api/vxmm/import-vip-phones endpoint với duplicate check cross-prize. Admin VipPhones: dropdown giải, import v2, filter, cột "Giải VIP". Summary: hiển thị HQ contact khi trúng giải 1-2-3. Build + FTP deploy done. ⚠️ Cần Bi: Upload hook mới qua datagiapha.ngoctinco.com/_/ + phân lại 5 SĐT VIP cũ. ✅
15/0516:46
🔥
SP
S Talent
Hotfix xuất PDF hồ sơ năng lực LIVE tại https://talent.io.vn. Bi báo nút "Xuất Hồ sơ Năng lực (PDF)" trên Profile screen ấn không có gì xảy ra (silent failure — không tải file, không alert). Root cause 3 bug đồng thời (Scout Haiku discovery): (1) Logo path lỗiProfilePdf.tsx:164 dùng <Image src="/brand/logo-white.png" /> relative path, react-pdf v4 không resolve được trong browser context. (2) Font race conditionFont.register() Be Vietnam Pro 4 weights từ cdn.jsdelivr.net/fontsource được gọi sync ở module level nhưng font load async không await trước khi pdf().toBlob() render. (3) Emoji không render — Badges dùng emoji 🎤👥🔥🧠... mà react-pdf default không có emoji font. Fix (Builder Sonnet, 2 file): (a) ProfilePdf.tsx thêm prop logoUrl?: string vào ProfilePdfData + <Image src={logoUrl}> dùng prop; export FONT_URLS[] constant cho consumer pre-fetch; thêm Font.registerEmojiSource({format:'png', url: cdnjs twemoji 14.0.2/72x72}). (b) ProfileScreen.tsx handleExportPdf pre-fetch FONT_URLS qua Promise.allSettled(...map(fetch)) trước render PDF → warm HTTP cache, allSettled không throw; truyền logoUrl={window.location.origin + import.meta.env.BASE_URL + 'brand/logo-white.png'} absolute URL; 5 console.log('[PDF] bước X...') debug từng bước; catch block alert hiển thị err.message cụ thể thay vì generic "Vui lòng thử lại". Build + Deploy (Shipper Sonnet): npm run build PASS 284 modules tsc clean; Python ftplib upload 180.93.36.233:21 user stalent 15 files trong 2 giây; verify https://talent.io.vn/ HTTP 200, hash mới index-C_bypRMR.js / index-CGxfzoFu.css khớp 100% local↔server. Lưu ý: PWA service worker giữ cache cũ → Bi cần hard refresh Ctrl+Shift+R bypass. Risk còn lại: CDN jsdelivr có thể bị CORS từ localhost dev — nếu Bi test còn font xấu/logo trống sẽ triển Option B fallback tải .ttf Be Vietnam Pro về public/fonts/ register absolute local URL. ✅
13/0509:32
🛠
KH
App Plustalent
FIX-PDP-SAVE-IN-EDIT-MODE: Mentee bấm "Lưu" trên PDP báo thành công nhưng dữ liệu không persist (case Quyên — plan v23 UEF Career). Root cause 2 tầng: (A) Mentor đã duyệt yêu cầu chỉnh sửa Mục tiêu → plan rơi vào trạng thái status="approved" + is_locked=false + edit_status="editing". Với is_locked=false, canEdit trong usePDPState trả về true → các nút Lưu tổng quát hiển thị. (B) Hàm save() có 3 nhánh if/else (draft/change_request, no plan, isExpert) không cover case mentee + plan.status=approved → silent fallthrough, hiển thị toast "Đã lưu bản nháp!" mà không gọi PB. Fix: (1) canEdit = !isExpert && !locked && !isClosed && !isEditingGoals — loại trừ chế độ chỉnh sửa Mục tiêu. (2) Thêm cờ didWrite trong save(), nếu không nhánh nào ghi DB thì throw error tiếng Việt hướng dẫn dùng "Gửi chỉnh sửa cho Mentor" hoặc "Yêu cầu chỉnh sửa PDP". (3) Mở rộng điều kiện render PDPEditRequest trong PDPForm.tsx để banner xanh "Bạn đang được phép chỉnh sửa mục tiêu PDP" hiển thị khi edit_status ∈ {requested, editing, submitted}. Không cần fix data: User reload, thấy banner đúng, dùng đúng flow "Gửi chỉnh sửa cho Mentor". Build pass, deploy FTP production. ✅
11/0501:35
🚀
KH
GrowX Talking Video
Fix IPv4 transport + Talking Video pipeline E2E hoạt động. Form /talking-form báo lỗi "Internal Server Error" khi submit — root cause: container uploads không có IPv6 route, mà api.airtable.com chỉ resolve IPv6 → httpx.ConnectTimeout. Fix: _uploads_app.py thêm transport = httpx.AsyncHTTPTransport(local_address="0.0.0.0") bắt httpx dùng IPv4. SFTP sync app.py lên VPS 160.191.244.132:/home/deploy/uploads-service/app.py, docker compose up -d --build PASS, container uploads recreate + Started. curl https://growx.160-191-244-132.nip.io/health trả {"ok":true}. Pipeline production: (1) HTML form upload video tham chiếu mp4 ≤20MB + voice text tiếng Việt + chọn 1/10 giọng OpenAI (onyx default) + tên KH (2) Backend /talking lưu video, tạo Airtable record (collection jobs), gọi Activepieces webhook Gpiqobf00OPH0rGnSj9Ik (3) Activepieces flow 6 steps: Airtable Running → TTS OpenRouter gpt-audio-mini stream PCM16 24kHz mono + wrap WAV header → upload internal uploads:8000 → Airtable save audio_url → Sync.so v2 lipsync model "lipsync-2" submit + poll 10s/13min → Airtable Done → Telegram noti. HTTPS qua nip.io DNS + Caddy auto Let's Encrypt → growx.160-191-244-132.nip.io (Sync.so yêu cầu HTTPS public URL). Test artifacts: test_full_vn.wav 19.6s thoại GrowX brand intro với onyx, test_lipsync_output.mp4 14MB Sync.so job a4d401f8 thành công. ⚠️ Sync.so free tier (3 video) đã hết khi test — Bi cần upgrade Hobbyist $5/mo để chạy production. ⚠️ Optional: Build Dify workflow UI (theo yêu cầu gốc) thay HTML form đơn giản. ✅
09/0520:53
KH
Việt Huy viethuynew
Convert chính thức Next.js trang chủ + trang sản phẩm (65% → 80%). Bi yêu cầu "convert trang chủ và trang sản phẩm sang next.js, đảm bảo chuyển đổi giống 100% bao gồm hiệu ứng". Chia 2 Phase delegate Builder Sonnet. Phase 1 (trang chủ): project mới 04-src/ Next.js 14 App Router + TS strict + Tailwind v3 + next/font Google (Be Vietnam Pro + JetBrains Mono). Config next.config.js output: 'export' cho FTP static deploy + images.unoptimized: true + trailingSlash: true. tailwind.config.ts brand tokens đầy đủ (navy #133578/baby #E8F0FB/cyan #00C2FF/gold #F0B94A/ink). globals.css extract toàn bộ keyframes từ HTML cũ (slide rotate / marquee / sphere glow / pin pulse / hover zoom). 5 layout components: Topbar, Header (sticky 129 dòng + 5 hover dropdowns), MobileMenu (8 mục accordion <details>), Footer (5 cột), FloatingButtons (FB/LinkedIn/Zalo/Tư vấn fixed). 5 home components: HeroSlider (5 slides 7s auto-rotate + Venn orbs UY TÍN/CHẤT LƯỢNG/HIỆU QUẢ), PartnersMarquee (pause-on-hover infinite), FieldsSection (3 cards 460px IntersectionObserver reveal + hover zoom + reveal CTA), CustomersMarquee, ContactSection (4 pin pulse Vietnam map + form 6 fields tiếng Việt). lib/types.ts Product/Linhvuc/SortBy types. 14 public assets copy (logo.png, logo-white.png, vietnam-map.png, fields/*, customers/*, partners/*). README dev/build/deploy. 38 files Phase 1, build pass. Phase 2 (trang san-pham): app/san-pham/page.tsx 'use client' + useSearchParams đọc ?linhvuc=y-te|thu-y|thuc-pham|moi-truong sync 2 chiều. 10 components mới components/sanpham/: HeroSearch (LIGHT baby-100 + breadcrumb dynamic + stats bar), CategoryCards (4 SVG line icon CYAN microscope/cattle/wheat/DNA — KHÔNG stock photo), Toolbar (sort/perPage 24-48-96/view grid-list/compare count), FilterSidebar (6 nhóm: Lĩnh vực/SP/Hãng mở sẵn — Công nghệ/Chứng nhận/Tình trạng collapse mặc định, chip active = bg-baby+border cyan), ProductCard (hover scale 1.05, cert badge gold vs baby, link cyan + outline navy mini button), ProductGrid (4-col / 2-col / 1-col + skeleton loading), Pagination, CompareDrawer (slide-up sticky bottom navy gradient, max 3 SP, container 1400px), FormCTA (2-col navy left + form 6 fields right + 3 contact icons hotline/email/zalo), EmptyState. lib/products.ts 8 SP seed (Sacace Real-TM Kit, Devyser NGS, Invitek Spin, AB Analitica HPV, Illumina MiSeq, Entrogen BRAF, Sacycler 96, Samag Extraction). 8 ảnh copy option3/assets/products/public/assets/products/. Bảo toàn 11 fixes UX đã apply. Build pass, route /san-pham prerendered static 9.25kB. Tổng: 50+ file mới Next.js project, 2 route static export sẵn FTP, ⏳ Bi test local cd 04-src && npm install && npm run dev.
09/0519:02
🎨
KH
Việt Huy viethuynew
san-pham.html 11 fix UX deployed (60% → 65%). 11 fix toàn diện trang Danh sách sản phẩm sau review của Bi: (1) Hero LIGHT đổi từ dark navy gradient → baby blue background + H1 navy #133578 font-extrabold + cyan eyebrow line + search bar nền trắng viền navy/15 + breadcrumb ink-soft + stats row (1.000+/7/15+) navy. (2) Category cards SVG icons thay 4 ảnh stock người (nhân viên y tế cười / chăn nuôi / đầu bếp) — vi phạm brand rule no-stock-photo — bằng 4 SVG line-style cyan trong vòng baby blue (microscope / cattle silhouette / wheat sheaf / DNA helix). (3) Filter sidebar phân biệt: chip ACTIVE dùng bg-baby + border-cyan + ✕ cyan, option CHƯA chọn dùng checkbox vuông border-cyan KHÔNG dùng pill — phân biệt rõ trạng thái cho user. (4) Card button hierarchy: "Xem chi tiết →" thành text-link cyan (không phải button), "Báo giá" thành outline navy mini button — 1 primary action + 1 link phụ rõ ràng. (5) Compare drawer sticky bottom 96px navy gradient hiển thị khi user tick ≥1 SP — mini-card 2-3 SP đã chọn + button "Xóa hết" / "So sánh chi tiết →"; JS đầy đủ addToCompare/removeFromCompare/clearCompare/updateDrawer tích hợp checkbox card. (6) Sync số: hero "1.000+ mã" tròn, toolbar giữ "1.024 mã", category 4 lĩnh vực giữ +. (7) Label "Tìm phổ biến:" navy/70 trước 5 chip Real-time PCR / Sacace / NGS Devyser / Tách chiết DNA / ELISA — user hiểu ngay đây là quick search. (8) Sidebar 3 nhóm collapse: Lĩnh vực + Nhóm SP + Hãng mở sẵn (chevron rotate-180), Công nghệ + Chứng nhận + Tình trạng collapsed mặc định (chevron rotate-0); JS toggleFilter() handle. (9) "Xóa tất cả" consistency: link cyan nhỏ ở chip area trên + outline navy button ở sidebar dưới — 1 chỗ link 1 chỗ button rõ ràng. (10) Dropdown 24/48/96 SP/trang trong toolbar bên cạnh sort — fix UX 43 trang quá nhiều. (11) Form CTA cuối trang restructure 2 cột: trái 40% (eyebrow "Hỗ trợ chuyên môn" + H2 "Cần tư vấn sản phẩm phù hợp với phòng lab?" + sub 2 dòng + 3 contact icons Hotline/Email/Zalo OA), phải 60% (form 6 trường + button cyan). File option3/san-pham.html 1055 → 1357 dòng (+302). Giữ Be Vietnam Pro per global CLAUDE.md (không đổi sang Sora theo spec — Be Vietnam Pro 800 weight = extrabold tương đương). Header/footer KHÔNG đụng. ⚠️ Reference files Bi mention _STYLE_GENOME.md + "file 06b SHOT 1/3" không tồn tại trong repo — proceed với 11 spec explicit của Bi (đủ chi tiết). Bi review trên trình duyệt → góp ý tiếp.
09/0511:19
🎉
SP
S Talent
Phase 1 production LIVE tại https://talent.io.vn (35% → 98%). 11 commits trong session: 9a8ab0b NaN guards 7 file + wire PB data (Survey/Profile/Home/Badges/Quests, HomeScreen tên user từ authStore + greeting động, HeroPanel SAI thật từ radar không hardcode 648, ProfileScreen load PB profiles → fallback localStorage → cache); a32e301 userStorage helper user-scoped chống profile data leak giữa accounts (`userKey()` + `clearAllUserData()`, `stalent_profile_draft_${userId}`); 62d0a8f logout button (Profile + Settings AccountSection, confirm dialog); 2c5336f empty states full Home/Quest/Career/Clan (`shared/ui/EmptyState.tsx`); a2bc35f fix "failed to create record" (signup className→grade map, friendlyPbError() dịch lỗi PB sang tiếng Việt: email trùng/password yếu/network); 07b887d Profile icons (Share navigator+clipboard / Settings → /settings / Edit pencil → modal save PB) + Help screen 8 sections (Khảo sát 12C/SAI Score/Radar 12 cánh/Quest/Career Compass/Clan/Mentor/PDF Profile) + FirstTimeGuide popup localStorage scoped; 63fdcec zero-state stats wire PB (Total XP/Coin từ authStore.model, Quest Done count completed, Streak max default 0, Home bỏ "+23 tuần này" delta giả); 39eb61c full sweep mock cleanup (TopBar red dot / Hero RankBadge "Thủy 3" / Career peers "+23 người" / Profile "Verified by Mentor" / Shop hardcoded balance=0 / Mentor mock sessions/certificates → wire `getPlustalentSessions` + `getPlustalentCertificates`); 9eddd58 Programs registration module (2 PB collections: `programs` public + `program_registrations` owner-only; routes `/programs` `/programs/:slug` `/programs/me`; form auto-fill 5 field từ authStore email readonly, dynamic field render text/tel/email/select/radio/checkbox/long-text/date, unique constraint chống trùng; helpers listPrograms/getProgram/registerProgram/getMyRegistrations/hasRegistered); b58e14f seed Glocal Citizen Podcast 10 form_fields đúng theo Google Form Bi gửi + 3 program seed (STEM Camp 2026 / English Communication 2026 / Career Workshop 2026); a357e29 BottomNav thay tab Clan → tab "Chương trình" (icon calendar ở giữa) + PWA bump version 0.1.0 → 0.2.0 force service worker auto-update. Phase 1 production: 13 PB collections (11 cũ + programs + program_registrations), 10 màn ported (Onboarding + Survey + Home + Quest + Career + Clan + Profile + Mentor + Shop + Settings + Help + Programs), no mock data leak, empty state UX full, PWA auto-update bumped 0.2.0. ⚠️ Pre-launch: chuyển hardcode admin credentials trong scripts (apply-programs-schema/seed-glocal-citizen) sang .env trước public release. ✅
09/0509:15
🚀
SP
S Talent
US-012 Deploy FTP staging (80% → 95%). Build production PASS 8.45s — 15 files / 2MB / main chunk 339KB (gzip 101KB) + react-pdf chunk 1.46MB code-split. FTP upload 180.93.36.233:21 user stalent — 15 files PASS (index.html, sw.js, workbox, assets/, brand/, icons/, manifest.webmanifest). Commit 2e74e1b. Domain smoke test: stalent.ngoctinco.com HTTPS trả về site khác (SSL cert mismatch — hosting chưa activate). Bi cần: (1) Activate hosting panel cho stalent.ngoctinco.com → trỏ đúng webroot (2) Apply PB schema theo 04-src/scripts/pb-migrations.md tại https://datastalent.talent.io.vn/_/. Phase 1 staging sẵn sàng sau khi hosting ON. ✅
08/0519:30
🎯
SP
S Talent
Brand identity update + Tài liệu nghiệp vụ 30 slides + PRD revised 12 stories + Mentor architecture clarified (30% → 35%). US-001 Brand identity: src/index.css primary #0BA5C7#2586CF blue, accent #EA294A#FFC500 vàng, thêm --cyan-light: #3EFDFD + --navy: #00437F, font Poppins thay General Sans; tailwind.config.js token đồng bộ; index.html theme-color + Google Fonts Poppins; manifest.webmanifest theme_color; public/brand/ thêm logo-black.png+logo-white.png từ Logo STalent.zip chính thức. Build PASS 2.43s, JS 200KB gzip 62KB, CSS 9KB. ⚠️ Bi cần xuất PNG icon 192/512px từ Logo STalent.ai thay placeholder PWA. Tài liệu nghiệp vụ 01-brief/STALENT-Tai-lieu-nghiep-vu.pptx 30 slides 2.25MB — A Tổng quan + B 5 tài khoản & user flow + C Sitemap & 9 màn + D Kinh doanh (Phase 1-3) + E Tech stack & Lưu ý; patch Mentor display-only sync Plustalent ở slides 5/7/10/20/23. PRD revised prd-loop/prd.json 12 user stories branch jobim/s-talent-fullbuild — US-001 done; US-002→US-012 pending: apply brand Home+Quest → Onboarding → Đăng ký → Khảo sát "công dân quốc tế" → Profile+Export PDF (Phase 1 go-live) → Career/Clan/Mentor sync display-only/Shop/Settings → PocketBase wiring → FTP deploy stalent.ngoctinco.com. Scope chặt: chỉ san-pham/S Talent/04-src/ + PROGRESS.md. Quyết định kiến trúc 08/05: (1) Brand mới blue+vàng+Poppins (2) Mentor display-only KHÔNG chat trong S Talent — chỉ sync sessions+certificates từ Plustalent (đối tác độc lập, nguồn thu Plustalent) (3) Phase 1 ưu tiên go-live: Onboarding→Survey→Profile radar→Export PDF (4) Phase 2: Quest/Career/Clan/Shop UI full lock CTA "Coming soon" (5) Khẩu ngữ TUYỆT ĐỐI không "du học" — dùng "công dân quốc tế". PocketBase admin https://datastalent.talent.io.vn/_/, FTP 180.93.36.233:21 user stalent. ✅
08/0512:13
🌏
KH
VNGG TECHNOLOGY
Rebuild trang san-pham + đồng bộ visual 4 trang menu (75% → 80%). Bug 1: website/san-pham/index.html mất body khi refactor CSS đợt trước (file chỉ còn 429 dòng head + 3 mount div) → rebuild đầy đủ 13 section theo SITEMAP-CONTENT.md (1240 dòng): A.1 Hero Tổng đài navy + hero-tech-bg, A.2 USP 3 thẻ feature-card, A.3 grid 8 tính năng 4×2, A.4 timeline quy trình 4 bước, A.5 bảng so sánh Truyền thống vs Cloud (8 hàng), A.6 FAQ accordion 5 câu, A.7 CTA + stats; B.1 Hero CRM "Sắp Ra Mắt", B.2 Vision + mockup, B.3 6 tính năng dự kiến, B.4 form notify; Cross-sell 4 lợi ích. Bug 2: 4 trang rebuild trước (khach-hang/lien-he/blog/blog/bai-mau) visual lệch với 2 trang gốc (homepage/san-pham) → audit anti-pattern, mở rộng assets/site.css 177→363 dòng với 16 class chuẩn (.card, .feature-card, .eyebrow/.eyebrow-white, .section-h2/.section-h2-white, .hero-h1/.on-dark, .text-gradient, .gold-divider, .hero-tech-bg+@keyframes gridDrift, .hero-glow, .reveal+.is-visible, .btn-ghost-white); assets/site.js 77→122 dòng thêm IntersectionObserver auto-wire .reveal; refactor 4 trang gỡ class redefine local (khach-hang -7, lien-he -9, blog HIGH severity hero soft→navy gradient + button class chuẩn, bai-mau 3 inline button → btn-gold). Anti-pattern grep = 0. Deploy FTP 180.93.36.142 user vngg, smoke test 6/6 trang HTTP 200 (homepage 75KB / san-pham 74.6KB / khach-hang / lien-he / blog / bai-mau). Còn placeholder Bi xác nhận: 2 số liệu san-pham ("500+ doanh nghiệp" line 803 / "ROI 2.3x" line 1103), logo KH thật (8 trắng + 8 màu), hotline, Maps embed, Zalo OA, FB/LinkedIn URL, ảnh 6 blog post, newsletter endpoint. ✅
30/04tối
🔒
KH
Lisa Nội Bộ
Phase 3 Mục 3 — Thelisa Proxy LIVE. Token Thelisa đã giấu khỏi bundle FE, đi qua PB hook proxy /api/thelisa/payroll-summary. pb_hooks/thelisa_proxy.pb.js: fix 3 bug JSVM — (1) scope: function declaration không visible trong handler → chuyển arrow function expression trong closure; (2) URLSearchParams không có trong goja runtime → build query string thủ công; (3) byte array decode ($http response body) → dùng String.fromCharCode.apply đúng cách. Auth guard ADMIN+MANAGER (KTV/Lễ tân/guest → 403), in-memory cache 60s/key, token đọc từ file pb_data/thelisa_token.txt trước (tránh shell escape ký tự đặc biệt). src/lib/thelisaApi.ts: refactor fetch direct → pb.send proxy, 3 message lỗi tiếng Việt đầy đủ (401 "Phiên đăng nhập hết hạn" / 403 "Không có quyền" / generic), token+URL Thelisa không còn trong lazy chunk. payrollService.ts: không nuốt silent 401/403 trong sync loop — throw error lên UI. PayrollPage.tsx: alert hiển thị e.message tiếng Việt thay vì generic string cứng. Bundle live đợt 2 sau hotfix: index-CGMaXTzw.js + thelisaApi-B0rrO-hg.js (1.4KB, clean). Verify toàn diện: Manager → 200 + JSON payroll ✅, KTV/Lễ tân → 403 ✅, expired token → 401 ✅. Deploy FTP thành công.
30/0409:10
🎨
KH
Việt Huy viethuynew
Polish bản test theo feedback Bi (giữ 60%). Logo chính thức: từ JPEG Bi cấp (843×596 nền xám) — Python script process_logo.py luminance threshold 200 + edge anti-alias smoothing → nền trong suốt; auto-crop bbox 518×175 + padding 4% ngang/10% dọc cân đối → 558×209 PNG. Sinh 3 phiên bản: logo.png (navy gốc, header), logo-white.png (silhouette trắng cho footer dark), logo-navy.png (dự phòng); backup logo cũ .backup.png. §2A 3 thẻ lĩnh vực: thay 3 ảnh Unsplash → ảnh local Bi cấp assets/fields/chan-doan-y-te.jpg (lab kit + PCR machine) / thu-y-chan-nuoi.jpg (nhóm gia súc gia cầm) / an-toan-thuc-pham.jpg (food safety testing). Footer: bỏ tagline italic "Science for life". Eyebrow §2A "Lĩnh vực hoạt động": giảm tracking-[0.24em]tracking-[0.08em] chữ khít hơn, bớt look eyebrow lỗi thời. Đóng gói lại: option3/viethuy-test.zip 5.6MB (18 entries) sync _deploy-test/ qua PowerShell Compress-Archive, sẵn sàng Bi up VPS test.
29/0412:30
🎨
KH
Việt Huy viethuynew
Bản test option3/index-test.html chỉnh theo feedback khách & sitemap docx (40% → 60%). Clone từ option3/index.html gốc (giữ nguyên không động vào). Topbar/Header chuyển sáng: bg-baby-100 + bg-white, logo assets/logo.png xanh gốc thay logo trắng. Hero — 3 sphere overlap "UY TÍN/CHẤT LƯỢNG/HIỆU QUẢ" (Venn-style, radial cyan→navy, glow, container 240×210, overlap nhẹ ~10px) thay badge "Science for Life". §2A 7-icon → 3 thẻ lĩnh vực 420×460px (Chẩn đoán Y tế / Thú y & CN / ATTP) ảnh Unsplash + hover zoom 8% + reveal "Xem giải pháp" + chữ tên hiệu ứng gradient text shimmer. Đảo §2B (marquee đối tác) ↑ trước §2A, bỏ "Xem tất cả đối tác". Xoá hoàn toàn §2C/§3A/§3B/§4A/§4B (~267 dòng) + thêm JS guards cho DOM elements deleted. §5B Khách hàng: tiêu đề căn giữa + chuyển grid 8 ô → marquee infinite (giống §2B), nhân đôi data, bỏ "Xem tất cả". §6A — 4 pin đỏ map-pin gắn trực tiếp lên bản đồ: bỏ list 4 VP bên phải, chấm cyan → 4 pin đỏ SVG (path location-pin fill #ef4444, lõi tròn trắng), mỗi marker icon + label gắn tại đúng vị trí (Hà Nội 13%/24%, Đà Nẵng 50%/28%, TP.HCM 73%/34%, Cần Thơ 80%/26%); animation 2 vòng pulse đỏ delay 0.55s + bob 3px nhịp thở; label glassmorphism navy 55% blur; prefers-reduced-motion support. Form §6A đổi tiêu đề "THÔNG TIN LIÊN HỆ" + mô tả mới. Header/Footer menu theo sitemap docx (option3/Thong tin bo sung hoan thien Website_VH.docx): desktop 8 mục (Trang chủ · Giới thiệu▾ · Giải pháp/SP▾ · Kiến thức Y sinh▾ · Tài liệu▾ · Tin tức▾ · Tuyển dụng · Liên hệ) — 5 dropdown đầy đủ submenu; mobile <details> accordion + scroll max-h-[80vh]. Footer 5 cột restructure (Logo+VP / Giới thiệu / Giải pháp+Kiến thức / Tài liệu+Tin tức+Khác / Bản quyền), tách hotline cột 1 thành "CSKH 0286 287 1596" + "Hỗ trợ kỹ thuật 0286 287 1597 (placeholder)". Floating: thêm Facebook (#1877F2) + LinkedIn (#0A66C2) — cụm 4 nút (FB → LinkedIn → Zalo → Tư vấn). Đóng gói deploy: option3/_deploy-test/ + option3/viethuy-test.zip (4.86 MB) chứa index.html (rename từ test) + 4 file root + assets/{logo, logo-white, vietnam-map, customers/*7 logo} sẵn upload VPS giải nén chạy ngay. Còn placeholder: SĐT KT, link FB/LinkedIn thật, logo nihbt.png ✅
28/04JOBIM
🎧
KH
Lisa Nội Bộ
JOBIM batch 7 task deployed. Orchestrator chạy 5 Builder Sonnet song song xử lý ALL_PENDING_NON_BANGLUONG.md. BUG-032 Admin/Thu Ngân mở thủ công KTV bị ĐÓNG hoạt động trong MỌI trường hợp (về sớm/OFF/lỗi/meal break) — tạo marker manual_reopen trong session_closures, getDailySessionBoard check isForceOpened bypass tất cả auto-close (tardiness/not_checked_in/meal_break/off), reopen tự động end active meal break + cancel registered. BUG-034 sửa logic earlyTardinessCovered bỏ so sánh checkout_time <= approved_time sai (chỉ cần đơn approved là miễn) — fix 2 chỗ trong attendanceService.ts (checkOut + manualEditAttendance); ExemptModal phân biệt rõ "Phạt tuân thủ — Đi trễ" vs "Phạt tuân thủ — Về sớm" với 2 checkbox độc lập, ngày, số tiền, màu nền cam/xanh. BUG-035 SessionRow main board hiện 🍚 NGHỈ ĂN + countdown + giờ kết thúc thay vì "ĐÓNG" trống (nền hồng), tag amber "Xong lượt ăn" cho KTV đang phục vụ + đăng ký nghỉ ăn. FEA-009 Phạt vệ sinh: collection hygiene_check_results mới (immutable result/penalty, mutable exemption fields) chạy migration thành công, service hygieneCheckService.ts với checkHygieneTask/exemptHygieneCheck/realtime subscribe, component HygieneCheckPanel nút "Đạt"/"Không Đạt" + form miễn phạt với check quyền theo ngày, cron hygiene-auto-check-cron.mjs auto-fail tasks chưa kiểm tra/chưa xong lúc 15:00, payroll dòng (12) thêm hygienePenaltyTotal aggregate vào penaltyTotal với UI expand "└ Phạt vệ sinh: XXXđ" realtime; quyền: cashier miễn chỉ hôm nay, admin miễn mọi lúc. IMP-024 phát hiện code multi-cashier (N records cùng tour_id) đã có sẵn từ refactor 25/04 — chỉ thêm prop addLabel theo team ("Thu Ngân"/"thợ Gội"/"KTV") trên TourRow + ManualScheduleEditor. IMP-025 Tab Nhanh popup KTV trống mở rộng computeSlotKtvs nhận expectedKtvs param (KTVs có ca chưa check-in), parseTardyInfo+computeExpectedWindow handle late/early/off/default, append isOff+tardyInfo vào MatrixKtvColumn, UI thêm section "DỰ KIẾN CÓ CA" 🔵 với cửa sổ "Dự kiến HH:MM–HH:MM" — đơn trễ/sớm/OFF tính ngay cả khi pending. IMP-026 rotation 3 chỗ (ScheduleRow/RotationPage/RosterManager) đổi từ userName.split(' ').pop() last-word → nickname || fullName (full name fallback đúng). 5 commits riêng, build pass 1m 10s, FTP deploy 183 files, migration PB collection chạy thành công. TODO Sếp: SSH VPS thêm crontab 0 15 * * * node /home/pocketbase/scripts/hygiene-auto-check-cron.mjs. Build TS clean (chỉ pre-existing errors trong authStore/phraseService/ProfilePage không liên quan).
28/0411:46
📦
SP
S Talent
REFACTOR feature-based architecture (25% → 30%). Bi yêu cầu: "phân tích gọn mỗi tính năng vào 1 thư mục độc lập để về sau dễ phát triển và mở rộng". Tách src/components/screens/ + src/components/shared/src/features/ (8 folder độc lập: home / quest / profile / career / clan / mentor / shop / settings — mỗi cái có index.ts barrel) + src/shared/ (ui: Card/Chip/Icon/StickerButton/primitives/PlaceholderScreen + layout: BottomNav/AppShell). HomeScreen 405 dòng → 53 dòng compose 4 component con: HeroPanel (SAI Score 648/1000 + radar 12 trục), StreakStrip (5 ngày), QuestPreview (3 nhiệm vụ hôm nay), CareerPreview (Digital Marketing Strategist roadmap). Mock data tách features/home/data/mock.ts (SKILLS/RADAR/DAYS/QUESTS), radar geometry helpers tách features/home/utils/radar.ts (buildRadarPoints/buildAxisPoints/buildRingPoints). App.tsx rút còn 9 dòng (chỉ wrap AppShell + AppRoutes), routes.tsx tách riêng 8 routes. Quy ước: features/X không cross-import features/Y, dùng relative imports (không cần config alias). tsc --noEmit clean, dev server OK localhost:5174. Folder components/ cũ đã xóa hoàn toàn. Lợi ích: thêm tính năng mới = tạo 1 folder + 1 route → xong; nhiều dev làm song song ít conflict git; dễ thay mock data → API call cùng chỗ ✅
13/0509:01
🟢
KH
Hara App
BUG-003 fix + UX progress bar AI analyze deployed ✅. services.ts: AbortController 30s cho callKimi, Promise.race 30s cho callGemini, retry loop bắt timeout/network error, message lỗi rõ hơn. MoodTracker.tsx: progress card animated 5 phase (🌌→🧘→💭→✍️→🌿) rotate theo %, curve 0-60%/8s, hold 90% chờ AI, jump 100% khi xong. Deploy v1.3.260513-0855 (bundleHash ClCLhdbk), 21 files FTP app.haragroup.vn. ✅
06/0521:32
🏦
KH
Hara App
[9/9] IMP-008 Đổi TK thanh toán Techcombank → ACB 🎉 JOBIM Batch [1-9]/9 HOÀN TẤT: Modal thanh toán khóa học (CourseDetail.tsx:422-444) đổi ngân hàng TECHCOMBANKACB, số TK 4141131131491386, URL VietQR TCB-...compact2.pngACB-491386-compact2.png (auto sinh QR mới với amount + nội dung CK đúng định danh học viên), chủ TK LÊ THỊ MỸ HUỆ giữ nguyên. Comment code cập nhật tương ứng. Grep toàn project sau fix: 0 occurrence Techcombank/4141131131. Build pass 5.64s, bundle index-DCbka-47.js 74KB, version 1.3.260506-2132, FTP deploy 21 files. ✅
06/0521:27
📚
KH
Hara App
[8/9] IMP-007 Đổi "Giảng viên" → "Người dẫn đường": Text update đơn giản trên trang khóa học. Audit toàn app: chỉ 1 occurrence "Giảng viên" tại app/CourseDetail.tsx:308 — fix 1 dòng từ • Giảng viên: Hara Team• Người dẫn đường: Hara Team. Không có schema field DB cho instructor (hardcoded "Hara Team"). Build pass, bundle index-CFd395Tq.js, version 1.3.260506-2124, FTP deploy 21 files lên app.haragroup.vn, smoke test HTTP 200 + version match. ✅
06/0521:17
🌳
KH
Hara App
[7/9] IMP-006 Khu vườn tâm trí: Feature redesign thay HOÀN TOÀN biểu đồ Recharts LineChart bằng visual "Khu vườn tâm trí" 5 scene SVG inline. Component mới MindGarden.tsx (150 dòng) — props {moodScore: 1-5}, SVG viewBox="0 0 400 300". 5 scene: 🚨 cây trụi + đất nứt + mây xám trôi 12s / 💜 cây ít lá vàng + 1-2 lá rơi 6s / 🌱 chồi non grow-in 800ms / 🕊️ cây xum xuê đung đưa ±2deg 4s + nắng / 🌸 hoa rực rỡ + 2 bướm bay 4-6s + cầu vồng. CSS keyframes inline + prefers-reduced-motion. Sửa MoodTracker.tsx gỡ recharts + xóa LineChart, thay grid 14 ô lịch sử emoji + ngày. Gỡ dep recharts khỏi package.json (npm uninstall 36 packages) + vite.config.ts bỏ vendor-recharts entry. Bonus: vendor-recharts 372KB BIẾN MẤT → tiết kiệm 372KB tải về. Bundle index-OwL5EO0P.js, version 1.3.260506-2117, FTP deploy. ✅
06/0521:11
🫸
KH
Hara App
[6/9] IMP-005 Sửa Safety Banner: SafetyBanner.tsx 1 file, 3 chỗ (3 variant inline/modal/sticky-top dùng chung component). Đổi text 1 dòng cũ → 2 dòng tách biệt: "Bạn không một mình đâu🪷" + "Hãy gọi ngay nếu cần hỗ trợ👇". CSS thay <h2>/<h3>/<p> đơn → <div className="space-y-1"> chứa 2 <p> riêng. Giữ nguyên nút hotline + Đường dây 24/7 + Ban Cố Vấn. Build pass 9.46s, bundle index-BpUBdKNL.js, version 1.3.260506-2111, FTP deploy 22 files. ✅
06/0521:08
🌈
KH
Hara App
[4/9] IMP-003 Thay icon Mood Tracker: constants.ts:53-54 đổi 2 mức cảm xúc đầu: "Cần sẻ chia" 🌧️ → 🚨 (cảnh báo/đèn báo động) giữ #EF4444 đỏ; "Chông chênh" ☁️ → 💜 (purple heart) đổi #F97316#8B5CF6 tím. Giữ nguyên 3 mức còn lại (Bình ổn 🌱 / An vui 🕊️ / Hạnh phúc 🌸). Build pass 16.10s, giữ 16 chunks code-split từ [5/9] (main 74KB), bundle index-B2CYPt_S.js, version 1.3.260506-2108, FTP deploy 22 files, smoke test HTTP 200 + version match. ✅
06/0521:05
KH
Hara App
[5/9] IMP-004 Tốc độ app — Performance optimization toàn diện: App chậm ở mọi giao diện. Lighthouse Desktop = 91/100 (vượt mục tiêu 80). FCP/LCP 1.0s, TBT 0ms, CLS 0. Main bundle 1397KB → 74KB (-94.7%), 1 chunk → 16 chunks. 4 files: (1) App.tsx lazy load 5 view nặng (AdminDashboard/MoodTracker/Mailbox/CourseDetail/Courses) bằng React.lazy() + Suspense (2) vite.config.ts manualChunks 6 vendor: vendor-react 163KB / vendor-recharts 372KB / vendor-tiptap 330KB / vendor-ai 257KB / vendor-pocketbase 34KB / vendor-dnd 44KB (3) index.html bỏ font weight 600 + dns-prefetch PocketBase (4) services.ts dynamic import @google/genai chỉ load khi gọi Gemini fallback + cache courses 5 phút + knowledge_base 10 phút. Lazy chunks: AdminDashboard 77KB / MoodTracker 15KB / CourseDetail 13KB / Mailbox 7KB / Courses 5KB. Bundle index-i2m-wm-5.js, version 1.3.260506-2103, FTP deploy 10 files. ⚠️ Cache invalidation: gọi courseService.invalidateCache() sau khi admin update. ✅
06/0520:57
🎯
KH
Hara App
[3/9] IMP-002 Canh giữa slogan: Slogan "Văn hóa • Tỉnh thức • Kết nối" dưới logo trên màn hình Splash bị xuống dòng + lệch trái trên mobile hẹp (≤ 360px). Root cause: text-xl (20px) + tracking-widest (0.1em) cho 30 ký tự uppercase → tổng width vượt viewport iPhone SE → tự wrap. Fix CSS 1 dòng Splash.tsx:30: đổi h1 từ text-xl tracking-widest sang text-sm sm:text-xl tracking-[0.15em] sm:tracking-widest text-center whitespace-nowrap, wrapper thêm w-full px-4. Mobile (< 640px) dùng text-sm + tracking nhẹ → vừa 1 dòng; desktop ≥ 640px giữ nguyên text-xl + tracking-widest. whitespace-nowrap ép 1 dòng tuyệt đối. Build pass 12.96s, bundle index-DeSB7oou.js 1397KB / gzip 389KB, version 1.3.260506-2057, FTP deploy 10 files, smoke test HTTP 200 + version match. ✅
06/0520:50
🤖
KH
Hara App
[2/9] BUG-001 Mood Tracker → Kimi AI: Gemini key cũ AIzaSyDv79... bị Google suspend (CONSUMER_SUSPENDED 403) → Bi quyết chuyển Kimi AI (Moonshot Global) thay vì xin key mới, GIỮ Gemini làm fallback. Refactor multi-provider AI: services.ts thêm AiProvider = 'kimi' | 'gemini', hàm callKimi() OpenAI-compat POST https://api.moonshot.ai/v1/chat/completions (model kimi-k2.5, response_format json_object, KHÔNG truyền temperature vì k2.5 chỉ chấp nhận default=1), callGemini() giữ SDK @google/genai, callAi() dispatcher tự động fallback (primary lỗi → thử fallback). analyzeMoods refactor dùng callAi(prompt, {json:true}), GIỮ NGUYÊN: cache 5 phút theo latestLog.id, prefilter checkSafety() 14 keywords SOS, retry/backoff 1s/2s/4s. systemService mở rộng: ai_provider, kimi_api_key, kimi_model, kimi_base_url, gemini_model; giữ alias getApiKey/setApiKey. Admin UI mới: AiConfigModal.tsx 145 dòng — 2 tab Kimi/Gemini, radio chọn primary, dropdown model, input key + Base URL, nút "Test kết nối" verify HTTP 200. Bi cấp key sk-Q2Pa...tId đã upsert PB production qua script save-kimi-key.mjs. Build pass, FTP deploy 10 files app.haragroup.vn, bundle mới index-gRN8QdpX.js. Verify Kimi API HTTP 200 với key thật. ✅
06/0520:35
🛡️
KH
Hara App
Hotfix [1/9] Admin trắng: Admin click vào Tháp Điều Khiển bị blank page. Root cause: useEffect line 149 AdminDashboard.tsx để loadAllOrders (useCallback) trong deps array → mỗi lần setAllOrders re-render thì reference mới → loop vô tận → React treo trắng. Fix 3 files: (1) AdminDashboard.tsx xóa loadAllOrders khỏi deps + bọc loadData() 3 try/catch độc lập + null-guard lesson.video_file?.split (2) components/ErrorBoundary.tsx mới — class component bắt runtime error, UI tiếng Việt, nút "Tải lại", details DEV mode (3) App.tsx bọc <AdminDashboard /> bằng <ErrorBoundary fallbackTitle="Lỗi tải Tháp Điều Khiển">. Build pass, FTP deploy 10 files lên app.haragroup.vn, bundle mới index-hDqzkdKc.js. Lần sau có lỗi sẽ hiện error UI có nút Tải lại thay vì trắng. ✅
28/04lượt 2
🛠
KH
App Plustalent
FIX-ADMIN-PDP-ACTION-PLANS-JSON (hotfix): Section "Kế hoạch hành động" trong admin PDP detail dump JSON thô. Root cause: Builder lượt 1 chỉ handle goals/swot/personal_info/expectations/review_12months, field action_plans rơi vào fallback JSON.stringify. Fix PlanContentRenderer.tsx: thêm ActionPlansSection (card per goal + mini-cards per item với status badge / deadline / detail_target / expected_result / support_needed), RoadmapSection (monthly_actions grouped by goal), refactor GenericFieldRenderer XOÁ HOÀN TOÀN JSON.stringify — array-of-object thành mini-cards, array-of-primitive bullet list, object key-value rows. Build pass, FTP deploy 11 files OK (bundle index-Ci1qCxyq.js) ✅
28/04lượt 1
🔎
KH
App Plustalent
FEAT-ADMIN-PDP-DETAIL-VIEWER: Sếp Bi feedback admin chỉ thấy mentor đã xem PDP hay chưa, không xem được nội dung 6 phiên check-in. Mở rộng modal chi tiết cặp Mentor-Mentee. Tab "Nhật ký 6 phiên": cross-reference "Mentor đã giao từ Phiên N-1", badge tháng, đầy đủ achievements/next_actions/extra_notes, thumbnail ảnh bằng chứng + lightbox full-screen z-[60], footer timestamp updated. Tab "Kế hoạch PDP": PlanContentRenderer thay Object.entries generic — goals array render thành card có badge KPI + tên sách + aspect/deadline. Files mới: CheckinCard.tsx, PlanContentRenderer.tsx. Build pass 14.49s, deploy FTP production ✅
24/0416:21
📞
KH
Hara App
IMP-001 Hotline format (Sprint 5d): Sửa số điện thoại hiển thị trên SafetyBanner trong Mood Tracker và prompt SOS của Gemini. SafetyBanner.HOTLINE_DISPLAY: 093.115.62130931.156.213. services.ts:1054 Gemini crisis instruction cũng update. tel:0931156213 giữ nguyên (đã đúng). Build PASS 8.52s, deploy bundle index-DDNxYKm_.js, version 1.3.260424-1621.
24/0415:35
🛡️
KH
Hara App
BUG-029 màn hình trắng + PWA Resilience layer (Sprint 5c, 96% → 97%). Khách chị Huệ Chrome Android báo trang load xong nhưng body trống. Diagnose: server OK toàn diện (HTML 200/4917B, bundle 968KB, PB data.haragroup.vn/api/health healthy, SSL 15/07/2026, DNS 180.93.36.231, sw.js precache đúng). Root cause = (1) Service Worker stale trên máy khách + (2) icon PWA 1×1 PNG placeholder làm Chrome không fire beforeinstallprompt → Bi xài Samsung bấm nút cài đặt rơi xuống manual modal. Fix gói 3 deploy: (a) version.json sinh tự động lúc build via Vite plugin custom (versionJsonPlugin closeBundle hook), (b) useVersionCheck() poll /version.json?t=ts mỗi 60s phát hiện deploy mới, (c) PWAUpdateBanner rewrite tri-state idle/available/updating + progress bar 4 bước (10% clear Cache Storage → 40% unregister SW → 70% dọn workbox-* IndexedDB GIỮ hara-offline-queue để không mất mood logs chưa sync → 100% hard reload ?v=ts), gradient teal sticky bottom-right, (d) Profile screen hiện Phiên bản: 1.3.260424-1621 + nút "Kiểm tra cập nhật" manual, (e) kill-switch inline 8s trong index.html (setTimeout check __haraReactMounted + #root.children.length → auto unregister SW + clear caches + reload ?recover=ts) chống màn hình trắng tương lai, (f) script Python _hub/scripts/gen-hara-icons.py tạo icon 192/512/maskable RGBA gradient teal #008B8B→#0A6965 + chữ "H" deep teal trong vòng tròn trắng, (g) xóa dead code <link rel=stylesheet href=/index.css> (404) + <script type=importmap> (Vite đã bundle hết). 2 lần build/deploy: bundle index-B3Mu68c7.js rồi rebuild với tooltip Auth fix.
24/0414:30
🔧
KH
Hara App
Hotfix: Nút cài đặt app trên Samsung. Bi báo Samsung không thấy nút "Cài đặt ứng dụng" trên màn hình đăng nhập. Root cause: logic chỉ render khi canInstall||isIos, nhưng beforeinstallprompt không fire trên Samsung Internet (cần engagement) → nút ẩn vĩnh viễn. Fix: refactor utils/usePWAInstall.ts thêm isStandalone (matchMedia + iOS standalone detect), isAndroid, isSamsungInternet (UA /SamsungBrowser/i), canPrompt. install() mới trả {kind: 'prompted'|'manual'|'installed'} — không có promptEvent thì mở manual modal. Tạo components/InstallInstructionsModal.tsx 3 tab tiếng Việt: "Bấm ⋮ → Cài đặt ứng dụng" (Chrome) / "Bấm ☰ → Thêm trang vào → Màn hình chờ" (Samsung) / "Nút Chia sẻ ⬆️ → Thêm vào MH chính" (Safari) — auto chọn tab theo UA. Auth.tsx: condition đổi canInstall||isIos!isStandalone (luôn hiện trừ khi đã cài), text động "1 chạm"/"Hướng dẫn" theo browser. Build PASS 9.22s, bundle index-Dj4Zo8yR.js (+1.5 KB gzip), deploy 8 files.
24/0414:18
📱
KH
Hara App
Sprint 5 Audit trail + Admin Mobile Order Approval (95% → 96%). E2E test 10/10 PASS qua PB API: login → list course → enroll → free auto-active / paid pending → admin duyệt → unlock → progress đều thông. DB clean: 0 đơn pending treo, 2 KH HEALING active đang chờ Bi up content (course `healing-cam-xuc` 0 topic 0 lesson). Audit trail (D): PB schema `enrollments` thêm 2 field approved_by (relation users) + approved_at (date) qua admin API PATCH. approveEnrollment/rejectEnrollment ghi actorId = pb.authStore.model?.id + ISO timestamp — tránh tranh chấp duyệt đơn. Admin Mobile Order Approval (E): components/OrderApprovalSheet.tsx 136 dòng — bottom sheet slide-up branded mint+green, hiển thị course+học viên+SĐT+QR code copy+số tiền, 2 nút "Từ chối" (red, 2-step confirm in-sheet) + "Duyệt & Kích hoạt" (brand-green), thay hoàn toàn window.confirm() xấu trên mobile. AdminDashboard.tsx orders view: filter row (status: tất cả/pending/active/expired · period: 7d/30d/all · search SĐT), badge đỏ pending count trên nav button, card layout mobile-first (status pill amber/green/gray + course + student + amount + transaction code copy + 1 nút "Mở để duyệt"), hiển thị "✓ Duyệt bởi [tên admin] · [time]" cho đơn đã xử, sort pending oldest first → others newest. getEnrollmentsForAdmin({status, days, search}) mới với expand user_id,course_id,approved_by. Build PASS 8.49s, deploy bundle index-DfZWAumT.js.
24/0413:54
📝
KH
Hara App
Sprint 4 Polish (92% → 95% LIVE). Course/Payment hoàn thiện: nút "Copy nội dung chuyển khoản" với 2s feedback (giảm sai nội dung CK), onEnded video → mark is_completed=true, progress bar thực (query learning_progress per course thay w-[30%] hardcoded), badge "Miễn phí" cho course price=0 trên cả thumbnail + hero, free course auto-active status='active' không cần admin duyệt (transaction_code FREE-{uid}-{ts}), rejectEnrollment đổi .delete() → PATCH status='expired' giữ audit trail. PWA install button trên trang Đăng nhập: refactor utils/usePWAInstall.ts shared hook (singleton capture beforeinstallprompt + iOS detect + EventTarget cho multi-component subscribe), nút "Cài đặt ứng dụng Hara trên máy · Dùng offline · Nhanh hơn" trên Auth.tsx (chỉ hiện khi canInstall||isIos), PWAInstaller.tsx tiêu thụ hook chung. Tài liệu nghiệp vụ BUSINESS-FLOWS.md 10 mục Mermaid: roles+quyền, đăng ký+đăng nhập+PWA install, khóa học (browse→enroll→consume), thanh toán VietQR Techcombank 4141131131, mood+safety filter+hotline 093.115.6213, mailbox SOS, PWA offline IndexedDB queue, ma trận 11 PB collection, lỗ hổng nghiệp vụ (chưa có collection transactions riêng, admin chưa nhận email notify, course HEALING thiếu content). Build PASS 7.73s, FTP deploy 8 files (bundle index-B36dsoWZ.js), HTTPS 200 ✅.
24/0413:36
🚀
KH
Hara App
LIVE app.haragroup.vn ✅ (50% → 92%). Sprint 1 — Safety: checkSafety() mở rộng 14 từ khóa nguy hiểm (chết, tự sát, tự tử, không muốn sống, suicide, kill myself…), wired pre-filter chạy TRƯỚC Gemini trong analyzeMoods, force is_serious=true + push thread Mailbox priority. SafetyBanner.tsx (144 dòng, 3 variants modal/sticky-top/inline) hiển thị hotline 093.115.6213 + Cấp Cứu 115 + 1800 599 920. AdminDashboard view 'sos_alerts': bảng 8 cột + 3 stats card lọc thread priority=urgent & mood log safety_flagged. Sprint 2 — PWA: vite-plugin-pwa manifest (theme #008B8B, Vietnamese), Workbox 6 cache strategy, IndexedDB offline queue cho mood_logs sync khi online, PWAInstaller (beforeinstallprompt 30-day dismiss) + iOS modal + UpdateBanner skipWaiting. Sprint 3 — Deploy: build PASS 7.72s, FTP deploy 8 files (DELE-before-STOR vì file owner uid 1005), https://app.haragroup.vn trả 200, manifest+SW+theme-color all live. DB cleanup: xóa course HEALING duplicate (giữ b6ltodqb3dizjuj có 2 enrollment), slug healing-cam-xuc, UNIQUE INDEX trên courses.slug, xóa 3 SOS test thread. Còn block full launch: content course HEALING (2 KH trả tiền chờ Bi cấp), icon PWA chuẩn brand (Designer), code-split bundle 952 KB.
24/0407:57
🎬
KH
Việt Huy viethuynew
§3A Hover preview — giải pháp cuối: Sau nhiều vòng fix lỗi YouTube 153 (video không cho phép nhúng, dù đã đổi video ID, thêm onError detection, fallback timer) vẫn lỗi chớp → bỏ YouTube embed hoàn toàn, thay bằng CSS-only hover effect: ảnh zoom 8% (900ms cubic-bezier) + gradient navy overlay đáy + play icon cyan tròn 56px fade-in scale 0.85→1. Xoá ~130 dòng JS, 0 khả năng lỗi. §3B products carousel đã chuyển infinite loop x3.
24/0407:35
📄
KH
Việt Huy viethuynew
PowerPoint thuyết trình website: Tạo file present/VietHuy-Website-Presentation.pptx (21 MB, 7 slides 16:9 TELOS-inspired): Cover · BIG IDEA · Hiểu hơn · Phong cách+Màu · Typography+Quote+Mockup · Tính năng · Thank You. BIG IDEA "TRỌN GIẢI PHÁP · CHUẨN KHOA HỌC · VỮNG NIỀM TIN" nổi bật 16pt cyan 2 dòng. Logo logoviethuy.png/logovhtrang.png chuẩn tỉ lệ 2.77:1 (677×244). Watermark SCIENCE baby blue brand #DCEAF6. Body 10-11pt. Tiếng Việt UTF-8 đầy đủ. Script create_presentation.js 1058 dòng pptxgenjs.
22/0422:05
🚨
KH
Lisa Nội Bộ
HOTFIX BUG-028: Bảng "Lượt Phục Vụ" chết sau deploy FEA-008 tại Lisa PREMIUM Q.1 Bến Thành. Root cause 3 tầng: (1) script migration FEA-008 dùng key schema: cũ → PB 0.23 bỏ qua → collection meal_breaks chỉ có id; (2) frontend query sort: 'created' → 400; (3) IIFE trong sessionService.ts return somePromise không await → rejection thoát khỏi try/catch → kéo sập Promise.all. Fix 3 phát: HOTFIX-SCHEMA (patch 12 field) → HOTFIX-SCHEMA-V2 (thêm created/updated autodate) → FIX-SESSION-RESILIENCE (frontend rebuild đúng await). Bảng đã hoạt động lại.
22/0422:00
💰
KH
Lisa Nội Bộ
Kim Ngân 857k fix: Sửa thủ công phiếu lương Nguyễn Ngọc Kim Ngân tháng 4 — compliance_penalty_days 0→3, net_total 7.676.285→6.819.143. Commit e3e411d, deployed FTP.
22/0421:00
🍽
KH
Lisa Nội Bộ
FEA-008 Nghỉ Ăn 20 Phút: Collection meal_breaks, đồng hồ đếm ngược 20p, giới hạn 2 lần/ca, tích hợp Ma Trận (block màu) + Lượt Phục Vụ (tự đóng nhận lượt). Commit 34c0418, deployed FTP.
21/0412:00
👥
KH
App Plustalent
FEAT-ADMIN-MANUAL-PAIR: Admin ghép cặp mentor-mentee thủ công ngay trong trang "Theo dõi PDP". Files mới: UserCombobox.tsx + ManualPairModal.tsx. Idempotent (update nếu đã có), auto-backfill plans.mentor. Build OK, deploy FTP production ✅
21/0411:00
📊
KH
App Plustalent
AUDIT-PDP-PAIRS-ALL: Audit toàn bộ 74 cặp mentor-mentee. Kết quả: 13 PASS (active), 0 STUCK, 61 BLOCKED (chưa ghép — bình thường), 0 INCONSISTENT. Dữ liệu sạch. Script: backend/audit-pdp-pairs-all.ts
21/0410:00
🔧
KH
App Plustalent
FIX-PDP-EDIT-APPROVE-UEF: Mentor không thấy nút "Duyệt yêu cầu" chỉnh sửa PDP cho Trí Nhân. Root cause: mentee dùng flow cũ PDPUnlockRequestedit_status="" rỗng → PDPEditReview không render nút. Fix: data migration set edit_status="requested" cho plan 8u5jnttkgh7ydbj v47 + backfill 1 plan sót. Không cần deploy FE. Scripts: debug/fix/verify 3 files.
21/0409:00
🔍
KH
App Plustalent
CHECK-MENTOR-MULTI-MENTEE (điều tra): Xác nhận hệ thống cho phép 1 mentor nhiều mentee. Schema không có unique constraint trên matched_mentor/mentor/plans.mentor. Thực tế Mentor Vy có 3 mentee 1:1. Script: backend/check-mentor-multi.ts
20/0423:30
🔢
KH
App Plustalent
FIX-QUYEN-CHECKIN-ROOTCAUSE: Root cause cuối cùng của bug check-in phiên PDP — PB schema field month trong program_session_checkins bị khóa max=3 (thiết kế cho 3 tháng), calendar month 4 > 3 → PB silent reject 400 — ảnh hưởng toàn bộ user từ tháng 4/2026. Fix: patch month.max = 12 qua Admin API + set plans.mentor Quyên = Hồ Linh + bump SW cache v2→v3. Migrate PB + deploy FTP. Commit 6db05c5
20/0423:00
🔑
KH
App Plustalent
FIX-ADMIN-RESET-PASSWORD: Admin không reset được mật khẩu user khác (PB 404). Root cause: fix-api-rules.ts:40 set users.updateRule = 'id = @request.auth.id' → chặn admin. Fix: nới rule thêm || @request.auth.role = "ADMIN" cho cả updateRule + deleteRule. Script mới: backend/fix-users-admin-update.ts. Migrate PB production, không deploy frontend. Commit f48ef3d
20/0412:00
💳
KH
Lisa Nội Bộ
Thelisa Payroll Sync: đồng bộ phiếu lương từ Thelisa POS (hoa hồng + TV + tips + tạm ứng) — nút Đồng bộ + auto-poll 5 phút + modal đối soát + popup chi tiết tạm ứng (ngày/số tiền/lý do). Deploy FTP. Phase proxy ẩn token (pb_hooks) đã code nhưng HOÃN theo yêu cầu Sếp — kế hoạch lưu tại docs/THELISA_PROXY_PLAN.md.
20/0411:30
🐞
KH
Lisa Nội Bộ
BUG-024: Tab Nhanh Ma Trận không cuộn xuống 17h-24h (regression). Root cause: flex-1 trong parent không flex → layout collapse. Fix: đổi sang h-full khớp pattern Tab Chi tiết. Deploy FTP.
20/0411:00
KH
Lisa Nội Bộ
FEA-007 Duyệt miễn chấm công: approval workflow cho trường hợp đặc biệt không cần chấm công, trang duyệt cho ADMIN/MANAGER. Deploy FTP.
20/0422:00
🔊
KH
App Plustalent
FIX-SW-CACHE-BUST: Bug 3 (reload mất data) tái diễn sau 2 vòng fix vì Service Worker cache-first serve JS/CSS cũ. Root cause: user stuck ở build trước khi fix. Fix: bump CACHE_NAME v1→v2 trong public/sw.js, build + deploy FTP. Verify app.plustalent.org/sw.js = v2 + version.json = mo6pp816. User sẽ thấy banner cam "Phiên bản mới đã sẵn sàng" trong 60s → click Cập nhật → nhận đủ 3 fixes.
20/0420:00
🎁
KH
App Plustalent
FEAT-SUPPORT: Tính năng hỗ trợ người dùng — 2 collections (support_tickets + replies), form submit + upload ảnh 10MB×5, admin table + stat cards + filter + reply + notification realtime. 10 files mới, commit 6619b80, migrate PB + deploy FTP
20/0414:00
🔧
KH
App Plustalent
FIX-PDP-SESSION-SUBMIT: Mentee bấm "Hoàn tất Phiên" báo lỗi "Thiếu thông tin chương trình hoặc mentor" (widespread). Fix: resolve programId+mentorId từ program_members trong usePDPState, bỏ guard !programId trong usePDPDiary, cập nhật PB rule updateRule cho mentor. Deploy FTP
20/0410:00
🔧
KH
App Plustalent
FIX-PDP-MENTOR-VIEW: Mentor không xem được PDP mentee qua chương trình UEF/Career. Fix R1+R2: program_members query, grouped dropdown optgroup, siết PB rules 7 collections (subquery matched_mentor), skeleton/empty state/unauthorized guard. Deploy FTP
19/0416:00
📝
KH
App Plustalent
FEAT-PDP-EDIT: mentee yêu cầu sửa PDP → mentor duyệt → max 2 lần/CT, admin override không tính quota, `plan_versions` snapshot, commit dfbbe3e, migrate PB + deploy FTP
16/0414:30
🌐
KH
Lisa Nội Bộ
IMP-018 Form đặt lịch 6 ngôn ngữ: /book/vn + /book/en, chuyển KR/ZH/JA/TH, admin quản lý tên EN, embed iframe — deployed
16/0406:00
🔧
KH
Lisa Nội Bộ
BUG-018 + IMP-014/016/017: Fix booking không hiện Ma Trận + Redesign Tab Nhanh + DV chọn CN+giá + Gộp form đặt lịch — deployed
15/0418:00
💰
KH
Lisa Nội Bộ
FEA-006 Bảng Lương: phiếu lương realtime + biệt danh + đồng bộ chấm công + chat admin↔NV — deployed
15/0417:00
🔧
KH
Lisa Nội Bộ
BUG-015/016: Fix phạt tuân thủ logic sai + migration 137 records + IMP-010→014 (Ma Trận snap-grid, ẩn KTV, OT modal, timeline bar)
14/04
🚀
KH
Lisa Nội Bộ
Sprint 14/04: Góp ý ẩn danh refactor + BUG-013/014/015 + Tab Grid dịch vụ — deployed
09/04
🚀
KH
Lisa Nội Bộ
10 Prompt Batch: BUG-010/011/012 + IMP-005→010 + FEA-005 Danh sách booking — deployed
08/04
🚀
KH
Lisa Nội Bộ
FEA-002 Ma Trận Lịch Hẹn: 6 phases (Nền tảng + Booking + Nhóm + Auto-fill + Thanh toán + Cảnh báo) — deployed
05/04
🔧
KH
Lisa Nội Bộ
FEA-001/003/004: Thu Ngân xếp ca + Salary fields + CCCD upload + BUG-005/006 fix — deployed
01/0410:00
🚀
KH
Lisa Nội Bộ
GPS chặn 30m + Đồng bộ Chấm Công↔Lượt Phục Vụ + Xoay Ca Thu Ngân — deployed (99%)
31/0323:30
KH
Lisa Nội Bộ
Chấm Công Phase A+B: check-in/out + OT (tăng ca) + miễn trừ nâng cao + gate check + deploy
31/0310:26
📋
KH
VietHuy1
Thêm dự án mới, khảo sát template Mediplace
30/03
🚀
KH
Lisa Nội Bộ
UI Overhaul + Trạng thái ĐÓNG + Tài liệu hướng dẫn
30/03
🔧
KH
Diệp Dương
Rebuild index.html + 5 trang con từ WordPress
30/03
🚀
SP
Phát Triển BV
Code Next.js 17 components, build OK
31/0315:18
🔧
KH
App Plustalent
Fix khung 24/48/72h vòng 2: 72h mở khi 48h đóng, xóa Netlify, deploy FTP
🔧
KH
App Plustalent
Fix pagination bug mentee không thấy nút làm bài vòng 2 (59 members > 50/page)
31/0313:30
🔧
KH
App Plustalent
Ops fix gộp account trùng mentee + fix vòng 2
29/03
🔧
KH
App Plustalent
Fix Vòng 2 check-in timing
29/03
🎨
SP
Phát Triển BV
Hero redesign + Survey 30 câu VCCI CSI
28/0310:18
🎨
KH
Việt Huy Web
Color 60-30-10 + 4 landing pages + Mega menu. Deploy FTP — 90% → 95%
28/0320:15
📈
HT
DASHBOARD
Cập nhật tiến độ tổng: đồng bộ 22 PROGRESS.md. LIVE 4, Backend 7, Mockup 6, Chưa code 6
26/0321:30
🚀
KH
Lisa Nail
— App Nội Bộ: Trễ/Sớm sửa+hủy, biệt danh nhân viên, admin/manager/lễ tân xóa đơn — deployed (98%)
19/0316:00
🚀
KH
Lisa Nail
— App Nội Bộ: Branches management, fix admin users, PWA update prompt — deployed (98%)