Ba việc lớn. Một: bản thiết kế sync phòng tuần trước đã thành code — app pms
trong chicstay-backend tự hỏi PMS của chủ nhà, không qua chicdata nữa; đối chiếu với production
khớp tới từng khoảng bận, đã merge develop và đang chạy trên staging từ 28/09
(production chưa bật). Hai: hai đợt onboard (24/09: 8 cơ sở · 46 phòng; 28/09: 12 cơ sở · 41 phòng)
vào chicdata, bắt được ba lỗi làm mất dữ liệu lặng lẽ — trong đó có mật khẩu PMS suýt lên production.
Ba: Gohost đổi giao diện sáng 24/09 làm Bum (52 phòng) và Lela chết lịch hai lần trong một buổi.
Như tuần trước: các commit tính năng khác của chicstay-backend (flash sale theo phòng, lasting sale,
combo khung giờ, phụ thu theo số lượng, dashboard User active…) là của đội dev ChicStay. Phần của mình là
sync PMS, hai trang admin lịch phòng và bản vá cron — mục A.
f33b1b3, 26/09)pms mới: port nguyên engine chicstay_room_state (7 adapter + sync_core),
tầng ghi viết lại bằng ORM ghi thẳng overlay ExternalBusyInterval/ExternalRoomState.
Model InventorySource / InventoryRoomMapping / PmsSyncRun / PmsRoomChange; credential chỉ ở env.run_pms_sync: một tiến trình sống lâu, vòng 60 s, lấy song song, ghi tuần tự.degraded.PMS_SOURCE=native|chicdata, mặc định chicdata; bridge cũ tự nhường khi bật native — lùi lại không cần deploy.backfill_pms_from_chicdata nạp một lần 310 dòng ghép phòng từ chicdata (đọc thuần).docs/superpowers/specs/2026-09-26-*.| Hạng mục | Trước (production hiện tại) | Sau (ChicStay tự đồng bộ) |
|---|---|---|
| Đường dữ liệu | PMS → room-state → DB chicdata → HTTPS /v1/rooms → cron 5 phút → overlay | PMS → run_pms_sync → overlay (cùng DB) |
| Độ trễ lịch về ChicStay | tới ≈6 phút | ≈60 s |
| Lúc khách bấm đặt | đọc DB chicdata, không hỏi PMS | hỏi thẳng PMS, 1,7–3,9 s |
| Hạ tầng | 2 repo · 2 app Fly · 2 bộ secret | 1 repo · 1 app + 1 process group |
Chạy local trên Neon branch copy production, so với chicdata production suốt 6,5 giờ ngày 26/09: 890/890 khoảng bận khớp, trạng thái 199 bận / 95 trống / 3 chưa biết khớp, mô phỏng 1.485 quyết định đặt phòng lệch 0 (297 phòng · 19 tài khoản PMS). Lệch còn lại đều truy ra là lệch pha hai vòng 60 s. Cả 6 lỗi đều ở phía ChicStay, mỗi lỗi có test chặn:
| # | Lỗi | Hậu quả nếu không sửa |
|---|---|---|
| 1 | bulk_create ép ::varchar(200) → cắt lặng mã khoảng bận dài (Dayladau 216 ký tự) | xoá–chèn lại vô tận mỗi lượt |
| 2 | PMS trả reason lúc None lúc "" | mọi lượt báo “sửa” 25 khoảng của Lela |
| 3 | Phòng STALE không bận ghi free thay vì unknown | booking gate xử khác production |
| 4 | Thiếu luật tuổi 15 phút (overlay là cột tĩnh) | tiến trình chết → phòng “trống” mãi — hướng sai nguy hiểm nhất |
| 5 | next_busy_at tính trên mảng thô | 122 phòng lệch chicdata |
| 6 | Một lỗi DNS tới Neon (26/09 19:06) giết cả run_pms_sync | 16 giờ không đồng bộ mà overlay vẫn như dữ liệu tươi |
Lỗi 6 sinh ra lớp canh riêng pms_watchdog (cron 5 phút, tiến trình độc lập): hạ phòng quá 15 phút
chưa đọc lại được xuống “chưa biết” và báo nguồn đứng im. Chạy thật: hạ 294 phòng, cảnh báo 19 nguồn.
develop (PR #53, #54): migration 0009 xếp sau 0008 của develop, db_default cho mọi cột NOT NULL mới để deploy cuốn chiếu không chết, “sửa” khoảng bận = xoá rồi tạo lại cùng id (tránh đâm UniqueConstraint mới).staging-prod-copy-20260928 (copy production), PMS_SOURCE=native, mail thử bẻ hết về một hộp nội bộ. fly.toml production không đổi.api-staging.chicstay.vn: trùng khách kênh khác (kể cả lấn 1 giờ dọn hai đầu) → 409; chạm đúng mép dọn → 201; trùng đơn ChicStay đang giữ → 409, gửi lại y hệt → trả lại đúng chỗ; tắt công tắc chặn bán → đặt được, bật lại → chặn. 23 lượt gọi PMS thật, 0 lỗi, 0,15–1,5 s/lượt. 10 đơn thử đều đã huỷ, không ghi ngược gì sang PMS chủ nhà.Hai chuyện hạ tầng staging: GitHub Actions của org hết budget từ 27/09 19:42 — workflow deploy
staging không chạy, phải deploy bằng flyctl từ đúng commit develop. Máy cron staging 512 MB bị
OOM khi 6–7 job */5 cùng khởi động ở :00 (giết sync_external_room_state,
complete_past_checkout_bookings) — đã dời pms_watchdog sang :02 (0a3e1b8), phần còn lại cần người quyết tăng RAM hay dời giờ job.
b7101bf, PR #38): ghép ChicStay (đang bán?) với lịch chicdata (có chảy về?), mở được bằng chứng gốc hai phía, xuất CSV.c0c5d85, PR #40): vẽ theo giờ như trang Trạng thái phòng của chicdata — mỗi khoảng bận một thanh đúng giờ, tách đơn ChicStay / kênh khác / host khoá. Cả hai đọc thuần, không migration.| Bảng chicdata | 21/09 | 28/09 |
|---|---|---|
| Merchant | 50 | 64 (+14) |
| Cơ sở | 109 | 128 (+19) |
| Phòng | 511 | 598 (+87) |
| Gói giá | 2.160 | 2.330 (+170) |
| Media | — | 7.806 |
Cơ sở +19 chứ không +20 vì Ora Hotel đã có sẵn vỏ P0107 từ trước, đợt này mới nạp phòng vào.
22Land Hotel & Spa, Moon Westlake, Classic, 22 Land Residence, Ora Hotel, Ohh Homestay Hồ Tây, KIM Apartment, DEMO Tôn Đức Thắng. 104 gói giá, 170 quy tắc giá, ảnh nén 1,9 GB → 80,1 MB. 21 phòng đủ để mở bán ngay, 25 phòng cần BD điền mô tả/ảnh. Toạ độ chỉ ghi khi hai nguồn khớp đúng số nhà — 4/8 cơ sở để trống có chủ đích.
c15c29e)Uni, Lya ×2, 22Land Cloud / Heritage / Cosmo / Lake View Hotel / Lake View Residence, Dodo Home ×4. Ảnh nén 6,0 GB → 66,7 MB, 31/41 phòng đủ 8 ảnh (10 phòng thiếu đều do thư mục của chủ nhà). Lya nối lịch dayladau 4/4. Dừng ở CS0001 Mer — sheet đã đánh số lại, nạp vào là đẻ ra cơ sở Mer thứ hai.
Ba thứ suýt lên production mà lượt chạy vẫn báo xanh:
| Chỗ hỏng | Hậu quả | Đã sửa |
|---|---|---|
| Ô album là link gắn vào chữ — gviz không trả đích | cả 41 phòng lên web với 0 ảnh | sheet-hyperlinks.mjs: tải bản .xlsx vá ngược vào dữ liệu gviz |
| Ô lịch Dodo ghi tên đăng nhập + mật khẩu PMS | chảy vào availability_ref rồi lên production | oLichAnToan() chỉ giữ đường dẫn; dọn 16 dòng đã lỡ ghi |
| Ảnh Dodo là PNG 24–33 MB/tấm, trần 20 MB | 9 phòng về 0 ảnh | nới trần 48 MB cho riêng tool (vẫn nén về WebP ~100 KB) |
Kèm skill dong-bo-phong-len-chicstay ghi lại trọn quy trình 14 bước, luật “chỉ thêm”, và điều kiện dừng rút từ ba lượt nạp. Test: 95 scripts/lib · 18 tests/chicstay · 738 chicstay_room_state.
Chưa phòng nào của hai đợt lên production. Bước nạp vào ChicStay chạy trên máy production mà Claude Code
bị guard quyền chặn, nên đã viết runbook cho người chạy tay:
reports/runbook-onboard-8-co-so-2026-09-24.md và reports/runbook-onboard-12-co-so-2026-09-28.md
(mỗi đợt ~5 phút, nạp ở trạng thái ẩn).
Sáng 24/09 Gohost bỏ widget Livewire; adapter coi “không thấy widget” là lỗi nên Bum và Lela FAILED mọi lượt,
52 phòng của Bum đứng ở STALE. Mở trình duyệt xem giao diện gọi gì → lịch nằm ở
GET /pms/app/<tenant>/calendar/events. Vá sang REST (4f48220): Bum xanh lại lúc 11:23, 58 phòng · 144 khoảng bận.
~11:30 Gohost trả widget về, REST ra 404 — chết lần hai. Bản vá thứ hai (d2301cc) thử cả hai đường:
widget trước, hỏng thì rơi sang REST; trả về 0 phòng cũng tính là hỏng, vì coi rỗng là thành công thì tầng đồng bộ
sẽ đóng sạch lịch cả nhà. Đo lại: 57 phòng, 166 khoảng bận, 4 phòng 33 ĐN khớp từng mã đơn với màn hình Gohost. 738 test pass.
/chicstay/listing) hỏi thẳng chicstay.vn, ghép 3 lớp vì API công khai không có
chicdata_room_id: 223/231 phòng đang bán gán được. Đổi 6 LATERAL sang CTE: 36 s → 4 s. Kèm tab Tiến độ lên phòng
(/chicstay/progress) — mỗi phòng còn thiếu gì để bán. Hai tab này chưa commit.offset chỉ ăn khi gửi kèm
limit — gửi riêng thì luôn trả trang đầu, crawl tưởng xong khi mới lấy 30. Kèm bộ chuẩn hoá sang đúng payload
onboard ChicStay (scripts/dayladau/to_chicstay.py): enum tiện ích nạp thẳng từ chicstay-backend để
lệch mã là báo lỗi ngay, phòng nhập về để ẩn. Code chưa commit; file dữ liệu có SĐT/email nên không đưa vào git./market lọc theo nguồn,
thay mục PlayerDuo — tổng 24.368 dịch vụ (playerduo 16.060 · lita 8.222 · thueplayer 86). Lita vượt được cổng tuần trước bằng
crawler trình duyệt (chữ ký chỉ ký pathname nên bắt 1 header rồi replay): 16 game · 5.543 player. Bấm card mở trang chi tiết nội bộ; UI chuyển sang token design-system.Hai đợt 24/09 và 28/09 mới nằm ở chicdata. Từ máy này không xác minh được runbook 24/09 đã chạy hay chưa.
Đã chặn không cho lên catalog, nhưng sheet nhiều người đọc được — cần nhờ chủ nhà đổi mật khẩu.
Lên production cần: secret PMS vào app production, process pms, PMS_SOURCE=native, tắt syncer chicdata,
và quyết dashboard chicdata + cảnh báo Lark (chưa port) sẽ đọc từ đâu. Cron staging OOM và Actions hết budget cần người quyết.
Các nhà khai “đóng mở trực tiếp trên web” — hợp lệ, nhưng phòng trống hay không phụ thuộc chủ nhà nhớ bấm. Dodo (12 phòng) cần bộ đọc mới cho shotel.vn.
Đệm dọn đầu giờ (B3 tuần trước) — trong commit tuần này chưa thấy quyết định đổi hướng, staging vẫn chặn 1 giờ hai đầu.
SUN HOMESTAY vẫn cần chủ kéo dài bảng lịch. Nhánh feat/onboard-7-home-chuan-hoa còn nhiều file chưa commit.