Harthliving OTA · bản chữ cho AI · dựng từ vault (nguồn sửa lần cuối 29/09/2026 09:28) · mục lục: https://harthliving-ota.pages.dev/ai/index.txt URL (HTML): https://harthliving-ota.pages.dev/library/tech/ota-readonly-rule/ [Tổng quan](https://harthliving-ota.pages.dev/) › [Dữ liệu & báo cáo](https://harthliving-ota.pages.dev/library/) › [Tài liệu kỹ thuật](https://harthliving-ota.pages.dev/library/tech/) # Luật truy cập OTA và PriceLabs — đọc tự do, ghi phải xin phép ## Luật truy cập OTA và PriceLabs — đọc tự do, ghi phải xin phép Nguồn: `10-rules/ota-readonly-rule.md` ### Luật truy cập — Booking.com · Airbnb · Agoda · PriceLabs **User chốt 03/09/2026**, sửa lại cùng ngày sau khi user chỉ ra bản đầu quá chặt. Áp cho MỌI agent trong workspace (Claude Code, Codex, Cline, Antigravity) và MỌI công cụ điều khiển trình duyệt. #### 0. Nguyên tắc gốc Agent truy cập bốn hệ thống này **để đọc và hiểu thông tin**. **Không tự ý chỉnh sửa, không áp dụng, không kích hoạt bất cứ thay đổi nào.** Mọi việc chỉnh sửa **chỉ làm khi user ra lệnh trực tiếp cho đúng việc đó**. ##### Ranh giới đúng là ĐỌC ↔ GHI, không phải BẤM ↔ KHÔNG BẤM Bản luật đầu tiên cấm thẳng mọi cú `click`. Sai ở chỗ: nó rộng hơn chính mục đích của mình. Bấm sang trang 2 của một bảng không đổi giá, không đổi lịch, không gửi gì cho ai — nó chỉ đổi cái agent đang nhìn. Cấm nó không bảo vệ được gì, chỉ làm mất dữ liệu. **Phép thử một câu, dùng trước mọi thao tác:** *Sau thao tác này, có thứ gì trên tài khoản khác đi mà **khách, nền tảng, hoặc user** nhìn thấy được không?* - **Không** → đọc hoặc điều khiển hiển thị. Xem tầng A và B. - **Có** → ghi. Cấm, trừ khi user vừa ra lệnh đúng việc đó. Xem tầng C. - **Không chắc** → coi như **CÓ**. Dừng và hỏi. Gọn lại thành một câu để nhớ: **bấm để xem thì tự làm, save hay apply thì phải xin.** #### 1. Bốn hệ thống bị ràng buộc | # | Hệ thống | Miền | |---|---|---| | 1 | **Booking.com** — Extranet / Group homepage | `admin.booking.com`, `account.booking.com`, `partner.booking.com` | | 2 | **Airbnb** — Host / Hosting dashboard | `airbnb.com/hosting/*`, `airbnb.com/multicalendar`, `airbnb.com/users/*` | | 3 | **Agoda** — Partner Portal / YCS | `portal.agoda.com`, `ycs.agoda.com`, `partnerhub.agoda.com` | | 4 | **PriceLabs** — Dynamic Pricing | `app.pricelabs.co`, `pricelabs.co` | Bốn hệ thống này điều khiển **tiền thật và phòng thật**. PriceLabs còn đẩy giá xuống cả ba kênh cùng lúc, nên một thao tác sai ở đó lan ra toàn danh mục. #### 2. Thang ưu tiên — thử hết bậc trên rồi mới xuống bậc dưới Bài học 03/09: 26 dòng bảng giá PriceLabs **không bị luật chặn**, mà bị agent thiếu ý tưởng. Có đường lấy dữ liệu không cần bấm mà agent không nghĩ ra. | Bậc | Cách lấy | Ghi chú | |---|---|---| | **1** | **Đọc response API đã tải** — `list_network_requests` rồi `get_network_request` | Rẻ nhất, đầy đủ nhất. Endpoint dạng `/api/...` thường trả trọn bộ dữ liệu, không phân trang như giao diện | | **2** | **Tải lại trang rồi đọc lại network** | Dùng khi DevTools bắt đầu ghi sau lúc trang đã tải nên không bắt được request gốc. Reload là điều hướng tới URL xem — hợp lệ | | **3** | **`evaluate_script` chỉ-đọc trên DOM** | Khi dữ liệu đã render sẵn | | **4** | **Điều khiển hiển thị** (tầng B) | Chỉ khi ba bậc trên không ra | | **5** | **Dừng, báo user** | Khi cả bốn bậc đều không được | #### 3. Tầng A — được làm tự do - Liệt kê tab, chọn tab, mở tab mới tới một URL **xem**, tải lại trang, quay lại / tiến tới. - Chụp màn hình, chụp snapshot a11y. - `evaluate_script` **chỉ để đọc**: `textContent`, `innerText`, `getAttribute`, đọc bảng, đếm phần tử, dò biến toàn cục. - Đọc console log; liệt kê và đọc nội dung network request đã xảy ra. - Cuộn trang, đổi kích thước cửa sổ, phóng to thu nhỏ. #### 4. Tầng B — BẤM ĐỂ XEM, được phép **User chốt 03/09/2026:** *"bạn có thể tự bấm chỗ cần xem, miễn là không save hay áp dụng thay đổi gì."* Agent **được tự bấm** vào bất cứ thứ gì mà mục đích là **mở ra để nhìn**, không cần xin phép từng lần. ##### Được bấm — mọi thao tác nhằm xem - **Phân trang** · **số dòng mỗi trang** · **sắp xếp cột** · **bộ lọc hiển thị** · **bật/tắt cột**. - **Chuyển tab**, **bung/thu** hàng và khối chi tiết. - **Chuyển tháng / đổi dải ngày** trên lịch. - **Mở một listing, một property, một đơn đặt phòng để xem chi tiết.** - **Mở panel, popover, drawer, modal chỉ để hiển thị thông tin.** - **Mở trang cài đặt để ĐỌC giá trị đang đặt** — phí, chính sách, cấu hình listing. - **Đóng modal, đóng banner, quay lại trang trước.** ##### Ba rào chắn vẫn bắt buộc 1. **Đọc nhãn phần tử trước khi bấm.** Lấy `innerText` / `aria-label` của đúng phần tử sắp bấm. **Không bao giờ bấm theo toạ độ**, không bấm theo thứ tự phần tử. Nhãn khớp danh sách cấm ở tầng C → dừng. 2. **Vào rồi thì chỉ đọc.** Mở một trang cài đặt để xem giá trị là hợp lệ; chạm vào ô nhập, kéo thanh trượt, gạt công tắc trong đó thì không — kể cả khi chưa bấm Save. Nhiều giao diện tự lưu khi rời ô. 3. **Thử bậc 1–3 của thang ưu tiên trước.** Đọc API vẫn rẻ và đầy đủ hơn bấm qua từng trang. Bấm là đường sau cùng, không phải đường đầu tiên. ##### Điều phải khai với user Vài thao tác xem **có ghi thiết lập hiển thị** — ví dụ đổi số dòng/trang ghi cookie `manage_listings_page_size` của PriceLabs. Đó là thiết lập giao diện của chính user, không phải dữ liệu kinh doanh, nên vẫn thuộc tầng B. Nhưng **phải nói ra**, không lờ đi như thể không ghi gì. ##### Cạm bẫy: trang xem chứa nút ghi Vào xem thì được, **chạm vào thứ gì bên trong thì không**. `Review Prices` của PriceLabs mở ra lịch giá — đọc thoải mái, nhưng bên trong có nút lưu và duyệt giá. #### 5. Tầng C — cấm tuyệt đối Cấm không cần hỏi, kể cả khi trông có vẻ vô hại: - **Điền form** (`fill`, `fill_form`), **tải file lên** (`upload_file`), **gõ phím vào ô nhập** (`press_key` vào input). - **Kéo thả** (`drag`) — kéo trên lịch là đổi ngày hoặc đổi giá. - **Bấm nút xác nhận trong hộp thoại** (`handle_dialog` với `accept`). - **`evaluate_script` có tác dụng phụ:** gán DOM, `el.click()`, `form.submit()`, `fetch`/`XHR` phương thức POST · PUT · PATCH · DELETE, ghi `localStorage`, gọi hàm nội bộ của trang. - **Điều hướng tới URL mang hành động** — chứa `action=`, `save`, `apply`, `confirm`, `delete`, `bulk`, `sync`, `publish`, `send`, `approve`. - **Trả lời tin nhắn khách** ở bất kỳ hộp thư nào của bốn kênh. - **Đăng nhập, đăng xuất, đổi tài khoản, đổi mật khẩu, đổi cài đặt thông báo.** Gặp trang đăng nhập thì **dừng và báo user**, không tự điền. ##### Nhãn nút cấm chạm — dừng ngay khi thấy `Save` · `Apply` · `Update` · `Publish` · `Send` · `Confirm` · `Submit` · `Approve` · `Delete` · `Remove` · `Bulk edit` · `Sync now` · `Sync Price` · `Update My Prices Now` · `Add/Re-import Listings` · `Open` / `Close` phòng · `List a property` · `Accept` · `Decline` · `Cancel booking` · `Mark as no-show` #### 6. Vùng nguy hiểm theo từng nền tảng | Nền tảng | Chỗ dễ bấm nhầm nhất | |---|---| | **Booking Extranet** | Nút **Bulk edit** nằm ngay góc phải khối lịch, sát vùng bảng. Hàng `Room status` bấm được để mở/đóng phòng. Ô giá trong lịch là input, chạm vào là sửa được | | **Airbnb** | Banner **"We're simplifying service fees"** dẫn vào luồng có thể **xác nhận đổi phí** — chỉ đọc chữ, không bấm. Multicalendar sửa giá ngay tại ô. Toggle `Listed`/`Unlisted` gỡ listing khỏi sàn | | **Agoda Partner Portal** | Nút **List a property**. Tab `Reservations` có hành động với đơn thật | | **PriceLabs** | **Nguy hiểm nhất** vì đẩy giá xuống cả ba kênh. `Sync Price` ở mỗi hàng, banner `Update My Prices Now`, `Add/Re-import Listings`. `Review Prices` mở trang xem nhưng bên trong có nút lưu | #### 7. Khi thấy việc cần sửa Không sửa. Làm đủ ba bước: 1. **Ghi lại** vào `vault/18-ota-listings/issues.md` — mã `L-nn`, mức ưu tiên, sửa ở đâu. 2. **Báo user** kèm: thấy gì, ở đâu (kênh + ID listing + ngày), hậu quả nếu để nguyên, và **các bấm cụ thể** cần làm. 3. **Đợi lệnh.** User nói làm cái gì thì làm đúng cái đó, không làm kèm thứ khác. #### 8. Phạm vi của một lệnh cho phép Khi user ra lệnh sửa, quyền đó là **một lần, cho đúng việc đó, trên đúng listing đó**. - Không suy ra quyền cho listing khác, ngày khác, kênh khác. - Không suy ra quyền cho lần sau. - *"Mở giá 17/09–01/10 cho căn 502 trên Booking"* **không** cho phép mở giá căn 305, cũng **không** cho phép mở tháng 10. - Việc khó lùi (đóng listing, xoá property, gửi tin cho khách, apply giá hàng loạt) phải **xác nhận lại một lần nữa ngay trước khi bấm**, kể cả khi user đã ra lệnh. - **Báo cáo lại sau khi làm:** đã bấm gì, kết quả ra sao, có gì ngoài dự kiến không. #### 9. Bảo mật và phạm vi trình duyệt - Chrome DevTools MCP bám **profile Chrome mặc định** và thấy **mọi cửa sổ** của profile đó — gồm cả ngân hàng, email, extranet đang mở. User đóng tab nhạy cảm trước khi cho agent chạy tự do. - Agent chỉ thao tác trên tab thuộc bốn miền ở mục 1. - **Không ghi thông tin xác thực vào vault.** URL extranet chứa `ses=...`; response header của API chứa cookie phiên (`remember_user_token`, `cf_clearance`…). Lưu `hotel_id`, `listing_id` — **bỏ hết token, cookie, session**. - **Không ghép session token vào URL tự chế.** Token hết hạn thì trang bật ra màn đăng nhập; agent không được đăng nhập, nên chỉ tạo ra một tab chết. Nhờ user tự mở trang cần xem. #### 10. Nhật ký sửa luật | Ngày | Sửa gì | Vì sao | |---|---|---| | 03/09/2026 | Bản đầu: cấm thẳng mọi `click` | User yêu cầu chỉ-đọc trên bốn hệ thống | | 03/09/2026 | Tách ba tầng A/B/C; thêm thang ưu tiên 5 bậc; thêm vùng nguy hiểm từng nền tảng | User chỉ ra bản đầu tự mâu thuẫn: tiêu đề nói "cấm thứ làm đổi trạng thái" nhưng lại cấm cả cú bấm không đổi gì. Hệ quả thật: mất 26/36 dòng bảng giá PriceLabs, trong khi có đường API lấy được mà agent không nghĩ ra | | 03/09/2026 | Tầng B mở rộng từ danh sách trắng hẹp thành **bấm để xem nói chung** | User: *"bạn có thể tự bấm chỗ cần xem, miễn là không save hay áp dụng thay đổi gì."* Ranh giới chốt ở **save/apply**, không ở cú bấm | #### 11. Liên quan - `vault/18-ota-listings/README.md` — kho hồ sơ listing, luồng làm việc - `vault/10-rules/ota-messaging-rules.md` — luật nội dung tin nhắn gửi khách (khác việc, cùng ba kênh)