Chic Data · Báo cáo tuần

Đưa 7 homestay lên bán, và vá ba chỗ dữ liệu đi lạc

08/09 – 15/09/2026 · ChicStay onboarding · review OTA · đồng bộ lịch · PlayerDuo
58 commit 9 phiên làm việc trên repo Chic 2 dòng sản phẩm: ChicStay & PlayerDuo Production: 47 host · 406 phòng

Tổng quan tuần

7
cơ sở mới lên production
26 phòng
84
review OTA thu về
5 cơ sở có điểm
274
phòng đã nối lịch tự động
+17 trong tuần
23
commit PlayerDuo
nguồn dữ liệu mới
13/26
phòng mới đủ chuẩn bán
13 còn vướng ảnh

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.

A. ChicStay — đưa 7 cơ sở lên production 11 commit

A1. Một cổng tiêu chuẩn thay cho việc soi tay

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.

A2. Hai lỗi dữ liệu vá được ngay ở khâu nhập

Chỗ hỏngHậ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.

A3. 14 phòng có ảnh nhưng lên web thành trắng ảnh

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.

A4. Tên phòng — 16 phòng mang chung một cái tên

Ô “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ọ.

A5. Hiện trạng 7 cơ sở

Cơ sởPhòngĐủ chuẩnẢnhTrạng thái
Misa Home — Thượng Thụy5545 mỗi phòngẩn
Fiora Palace — Giáp Nhất4412–16đã mở bán
Chilling — 90 Đường Láng228ẩn
Lela — Quan Nhân205–6ẩn
Lela — Trường Chinh414–8ẩn
Miu Homestay — Đê La Thành804–7ẩn
Peachy Studio — An Dương1132ẩ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.

B. Review OTA cho nhà mới 84 review · 2 lỗi khớp tìm ra

B1. Thu về 84 review cho 5 cơ sở

Cơ sởNguồnReviewĐiểm
Lela Quan NhânGoogle Maps (cách 17m)504.9 ★
Miu HomestayGoogle Maps215.0 ★
ChillingBooking104.3 ★
Fiora PalaceGoogle Maps23.0 ★
Peachy Hai Bà TrưngAgoda11.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.

B2. Thay bước chấm bằng máy bằng research trực tiếp — bắt được hai lỗi khớp

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.

C. Đồng bộ lịch phòng +17 phòng · 2 cách nối mới

C1. Lela dùng chung tài khoản Gohost của Bum

Đ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ó.

C2. Bum mở thêm 11 phòng — và ChicStay không có cách nào nhận lịch

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.

Kết quả đo ngay sau khi nối: 11/11 phòng 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.

C3. Độ phủ hiện tại

Chỉ sốĐầu tuầnCuối tuần
Cơ sở trong hệ8688
Phòng407418
Phòng đã nối lịch257274
Phòng ChicStay có lịch ngoài269289

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.

D. Cảnh báo & sự cố đầu tuần 10–11/09

E. PlayerDuo — nguồn dữ liệu mới 23 commit trong một ngày

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ế):

F. Rủi ro đang mở — cần đội quyết

F1. Fiora đã mở bán với điểm 3.0 sao từ đúng 2 review

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.

F2. 13 phòng chưa đủ ảnh để mở bá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.

F3. 69 gói ghi “Chỉ Thứ 2 – Thứ 5” nhưng vẫn điền giá cuối tuần

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.

F4. 41/88 cơ sở chưa nối đủ lịch

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.

F5. Việc đang chờ hạ tầng

  • Lela chưa chạy được dù đã ghép đủ 6 phòng: adapter trên production chưa có hai trường tenant/credentialsFrom. Cần deploy room-state (push main).
  • 15 commit chưa push trên nhánh feat/onboard-7-home-chuan-hoa.
  • chicgo_data không có commit nào từ 24/08 — tuần thứ ba đứng im.
  • Suite test chicdata còn 46 test đỏ có sẵn (45 lỗi mock 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.

Việc tuần tới