Tuần này có ba việc lớn và một việc nền. Lớn: đưa 7 cơ sở mới lên ChicStay kèm một bộ tiêu chuẩn kiểm được bằng máy; thu review OTA cho nhà mới; và nối lịch phòng cho ba nhà còn treo. Nền: PlayerDuo — một nguồn dữ liệu mới được dựng từ đầu trong một ngày.
Điểm đáng nói nhất không phải số lượng mà là ba chỗ dữ liệu đi lạc được tìm ra: một review 1 sao gắn nhầm nhà, 14 phòng có ảnh mà lên web thành trắng ảnh, và 11 phòng có lịch trong PMS mà ChicStay không bao giờ nhận được. Cả ba đều thuộc loại hỏng im lặng — không log đỏ, không ai báo.
Sheet 06_Tiêu chí Onboard & Publish có 35 dòng tiêu chí nhưng trước nay chỉ đọc bằng mắt.
Tuần này 11 tiêu chí kiểm được bằng máy đã thành một cổng chặn thật:
node scripts/chicstay-onboard-gate.mjs — thoát mã 1 nếu còn phòng vướng, nên cắm được vào chuỗi lệnh
chứ không chỉ là báo cáo đọc cho vui.
Kết quả lần chạy đầu: 8/26 phòng đạt. Sau khi vá dữ liệu trong tuần: 13/26.
Blocker duy nhất còn lại là ảnh. Tiêu chuẩn viết ở
docs/tieu-chuan-len-prod-chicstay.md.
| Chỗ hỏng | Hậu quả thật | Đã sửa |
|---|---|---|
| 63/117 dòng giá bỏ trống “Thời lượng (phút)” | ChicStay áp quy ước 12h/8h/24h. Gói “Trong ngày 10:00→19:00” là 9 tiếng nhưng khoá 8 tiếng — mở lịch sớm một tiếng, tức nhận đặt trùng | Tính từ giờ nhận–trả thật, có xử lý vắt qua nửa đêm |
| Ô “Tiện ích” (văn xuôi, có emoji) bị bộ nhập bỏ hẳn | 30 phòng đợt trước lên production với amenities rỗng — không lọc được, không sinh được Vibe | Suy ra 38 mã catalog bằng từ khoá; 26 phòng nay có 140 dòng tiện ích |
Luật đọc tiện ích được viết để thà thiếu còn hơn khai sai, và ba ca dễ nhầm nhất đều có test: “máy check cam ẩn” không phải camera an ninh, “máy sấy” cạnh máy giặt không phải máy sấy tóc, “không có bếp… cần sẽ set up bếp điện” là bếp theo yêu cầu.
Tool đẩy ảnh nhận diện ảnh đã đẩy theo file Drive gốc trên toàn hệ thống. Nhà nào nhiều phòng giống hệt nhau thì ops điền chung một link album, nên ảnh chỉ gắn được cho phòng xử lý đầu tiên — các phòng sau về 0 ảnh mà lượt chạy vẫn báo xanh. Misa mất 4 phòng, Chilling mất 1.
Đã viết scripts/nhan-ban-anh-phong.mjs: thêm dòng media trỏ vào đúng object đã nằm trên R2,
không tải lại, không nén lại, giữ đúng một ảnh bìa mỗi phòng. 5 phòng từ 0 ảnh lên 45 và 8 ảnh.
Ô “Tên hiển thị” viết ba mảnh ngăn bằng “/”, nhưng mảnh đầu khi là tên phòng (Oasis Blanc), khi là tên nhà (Lela Homestay). Bộ nhập cũ chỉ lấy mảnh đầu nên 6 phòng Lela, 8 phòng Miu và 2 phòng Chilling lên production trùng tên nhau — mở danh sách phòng trong admin không phân biệt nổi.
Đã sửa luật và đặt lại tên 22 phòng theo sheet. Không còn tên trùng. Riêng 4 phòng Fiora giữ nguyên tên người vận hành tự đặt trong Host Studio — không ghi đè công của họ.
| Cơ sở | Phòng | Đủ chuẩn | Ảnh | Trạng thái |
|---|---|---|---|---|
| Misa Home — Thượng Thụy | 5 | 5 | 45 mỗi phòng | ẩn |
| Fiora Palace — Giáp Nhất | 4 | 4 | 12–16 | đã mở bán |
| Chilling — 90 Đường Láng | 2 | 2 | 8 | ẩn |
| Lela — Quan Nhân | 2 | 0 | 5–6 | ẩn |
| Lela — Trường Chinh | 4 | 1 | 4–8 | ẩn |
| Miu Homestay — Đê La Thành | 8 | 0 | 4–7 | ẩn |
| Peachy Studio — An Dương | 1 | 1 | 32 | ẩn |
Toàn bộ đi qua staging trước, sao lưu Neon trước khi nạp production, dry-run mọi lượt ghi, và
soi từng phòng 30/30 khớp, 0 lệch ở cả hai môi trường. Không sửa một dòng code nào của
chicstay-backend — production chỉ chạy import_qa_catalog.
| Cơ sở | Nguồn | Review | Điểm |
|---|---|---|---|
| Lela Quan Nhân | Google Maps (cách 17m) | 50 | 4.9 ★ |
| Miu Homestay | Google Maps | 21 | 5.0 ★ |
| Chilling | Booking | 10 | 4.3 ★ |
| Fiora Palace | Google Maps | 2 | 3.0 ★ |
| Peachy Hai Bà Trưng | Agoda | 1 | 1.0 ★ |
Misa khớp tới 0.98 trên Booking nhưng listing chưa ai review; Lela Trường Chinh trắng review vì cơ sở chưa có toạ độ nên mọi phép khớp theo bán kính đều trượt.
Bước discover chấm ứng viên bằng LLM qua OpenRouter, và tài khoản đó hết credit
(HTTP 402) nên lượt chạy “thành công” mà không chấm được gì. Đi đường vòng có sẵn của tool
(--export → chấm → --apply), rồi mở thẳng trang OTA để đọc địa chỉ thật:
Một review 1 sao gắn nhầm nhà. Máy khớp listing Agoda “Peachy Studio” vào cơ sở An Dương ở mức 0.75. Mở trang ra thì địa chỉ ghi 27 Ngõ 70 phố 8-3, Hai Bà Trưng — đó là Peachy cơ sở cũ. Nội dung review cũng đã gợi ý sai: khách kể ở 4 đêm, “không ai mở cổng chính”, “phòng sân thượng tạm” — không giống một studio. Đã chuyển listing và review về đúng nhà; Peachy An Dương hết mang oan 1.0 sao.
Và một listing tìm được nhờ đọc trang: Agoda “LELA Home” ghi địa chỉ
612 Đường Trường Chinh 501 — đúng cơ sở Lela đang trắng review, số 501 còn trùng tên phòng
trong sheet. Máy trượt vì cơ sở thiếu toạ độ. Đã gắn kèm ghi chú căn cứ và
match_method=CLAUDE_CODE_RESEARCH.
Đo thật: đăng nhập bằng tài khoản Bum mở được gian hàng Lela (HTTP 200, có widget lịch). Adapter
Gohost nay nhận hai trường mới — tenant (mở đúng gian hàng thay vì gian hàng mặc định) và
credentialsFrom (mượn mật khẩu của tài khoản khác). Nhờ vậy khai được nhà mới
mà không chép mật khẩu ra thêm một chỗ nào: dòng khai nằm trong repo, mật khẩu vẫn ở nguyên
một chỗ trong secret. 5 test mới, toàn bộ 657 test của room-state xanh.
Ghép 6 phòng Lela phải làm tay: hai cơ sở chung một merchant và cơ sở nào cũng có phòng “601”, bộ ghép tự động chỉ dám nhận 1/6 rồi bỏ trống — đúng hành vi nên có.
Bum mở cơ sở 404 Bưởi (9 phòng) và 68 CG (2 phòng), tạo thẳng trong Host Studio nên
chicdata_room_id rỗng. Mà ChicStay chỉ có đúng một cửa nhận lịch ngoài:
PMS → room-state ghi inventory_blocks (khớp bằng source_mapping)
→ GET /v1/rooms?state=linked (FROM rooms LEFT JOIN source_mapping)
→ cron sync_external_room_state của ChicStay
→ khớp payload bằng Room.chicdata_room_id
Không có dòng trong bảng rooms thì phòng không bao giờ vào payload, dù Gohost có đủ lịch.
Giải pháp: mã móc lịch — dòng rooms + source_mapping tối thiểu, không giá,
không ảnh, không tiện ích, không QA. Đặt record_status=INACTIVE để importer của ChicStay
(vốn chỉ nhận ACTIVE) không bao giờ nạp chúng thành phòng trùng, còn room-state không lọc cờ đó nên
lịch vẫn chảy.
MATCHED, 9 khoảng bận đã về, 3 phòng đang có khách thật.
Đối chiếu ba tầng PMS → chicdata → ChicStay: mọi khoảng còn hiệu lực khớp mốc bắt đầu tuyệt đối.
| Chỉ số | Đầu tuần | Cuối tuần |
|---|---|---|
| Cơ sở trong hệ | 86 | 88 |
| Phòng | 407 | 418 |
| Phòng đã nối lịch | 257 | 274 |
| Phòng ChicStay có lịch ngoài | 269 | 289 |
Có thêm python -m scripts.bao_cao_sync để trả lời một câu mà trước nay phải mò:
cơ sở nào chưa nối lịch, và chưa vì lý do gì. Báo cáo tách ba cột (có tài khoản / đã map / có lịch thật)
vì thiếu bất kỳ khâu nào thì lịch vẫn trống mà không lỗi nào nổi lên.
LARK_AT_ALERT nhận danh sách nhiều người.Dựng trọn bộ thu thập dữ liệu playerduo.net.vn trong ngày 14/09, đi qua API thay vì Playwright (quyết định có ghi lại lý do trong thiết kế):
execute_values thay vì từng dòng.raw ra ngoài.4 phòng Fiora được mở bán trong tuần. Điểm hiển thị là trung bình của một review 5 sao không lời và một review 1 sao kể chuyện điều hoà không mát, nồi cháy đáy. Hai mẫu thì chưa nói lên gì nhưng đã hiện cho khách. Cần quyết: ẩn điểm tới khi đủ mẫu, hay để nguyên.
Lela 5 phòng (4–7 ảnh) và Miu 8 phòng (4–7 ảnh), chuẩn tối thiểu là 8. Hai nhà này mỗi phòng có album riêng thật nên không nhân bản được như Misa/Chilling — phải chụp thêm.
ChicStay không đọc cột “Ngày áp dụng gói” nên đang bán cả 7 ngày theo giá cuối tuần. Nếu gói thật sự chỉ áp T2–T5 thì đang bán sai 3 ngày mỗi tuần. Dính Fiora 16 gói, Lela 18, Miu 32, Peachy 3.
Nhóm lớn: Alà 4 cơ sở map thiếu, Amoureux 4, The Door 2 (sheet có khai nguồn từ đợt 08/09 nhưng chưa ai dựng tài khoản), Trốn Hoàng Mai, Fish Nguyễn Khang. Thêm 14 nhà cũ chưa từng có tài khoản nào.
tenant/credentialsFrom. Cần deploy room-state (push main).feat/onboard-7-home-chuan-hoa.useEventsDb, 1 test style)
— không phải do tuần này, nhưng đang che mất tín hiệu của CI.