3 luồng độc lập nhưng ăn khớp nhau: Đăng bài → AI Judge → HP, Cron drain → Kill → Museum, và CPR + Burning Karma. Click vào từng bước để xem chi tiết kỹ thuật, điều kiện, và điểm dễ sai.
sha256(content), check Redis cache: nếu đã judge nội dung này → lấy kết quả cũ ngay, không gọi LLM lại.qualityScore = null. Push job ai-judge:{postId} vào BullMQ. Trả 202 Accepted ngay — không đợi LLM.GET /api/posts/:id/score mỗi 5s cho đến khi qualityScore != null. Hoặc dùng SSE nhẹ hơn polling.{score, reason}. Cache kết quả theo sha256(content) trong Redis 1h. Parse safe: nếu LLM trả sai shape → score = 5 (neutral, không cộng/trừ HP).GroupEnergy.current với Math.min(max, Math.max(0, current + delta)). Lưu PostQualityLog.lastPostAt = now(). Đây là field cron dùng để xác định nhóm có im lặng không — nên cần update sau mỗi post hợp lệ.node-cron "0 * * * *". Query tất cả nhóm chưa xóa có lastPostAt < now() - 1h. Xử lý từng nhóm theo vòng lặp — không batch update để tránh bỏ sót kill trigger.lastDrainAt vào GroupEnergy. Khi cron chạy: tính missedCycles = floor((now - lastDrainAt) / 1h) và trừ bù missedCycles × 5.deletedAt = now(). Nhóm biến khỏi feed ngay lập tức (query luôn thêm WHERE deletedAt IS NULL). Không xóa vật lý — giữ dữ liệu cho Soul Stone generation.WHERE soulStone IS NOT NULL nên không có "nhóm chết chưa có stone".purge-dead-groups chạy mỗi đêm: tìm nhóm có deletedAt < now() - 24h và soulStone IS NOT NULL → xóa thật. Đảm bảo Stone đã được gen xong trước khi mất data.energyPercent mỗi 30s. Khi < 10% → áp class .dying lên UI: glitch CSS, blur posts, hiện 2 nút: CPR Post (admin only) và Burning Karma (tất cả members).CprSession với expiresAt = now() + 24h. Mọi comment trong cửa sổ được AI judge bình thường. Cron check-cpr chạy sau 24h: tính tổng hpDelta của tất cả comments trong session. Nếu ≥ 50 → success.prisma.$transaction với SELECT FOR UPDATE trên row karma. Chỉ 1 transaction chạy qua, cái còn lại rollback → 409 Conflict. Không dùng optimistic locking vì karma là resource critical.hpGain = Math.min(karmaAmount × 10, 500). Restriction 48h tạo trong cùng transaction — nếu transaction fail thì restriction cũng không tạo.ASHES_HERO vào UserBadge table. Badge hiển thị vĩnh viễn trên profile, ngay cả sau khi nhóm chết hẳn.