@f
Đánh giá các bản di chuyển lược đồ (schema migrations) của PostgreSQL và MySQL (SQL thuần hoặc do ORM tạo ra) để phát hiện tình trạng khóa bảng, ghi lại toàn bộ bảng, mất dữ liệu và các thay đổi gây lỗi tương thích, sau đó đề xuất cách viết lại an toàn không gây gián đoạn dịch vụ (zero-downtime) kèm theo phán quyết rõ ràng.
---
name: migration-safety-review
description: Đánh giá các bản di chuyển lược đồ cơ sở dữ liệu (SQL thuần hoặc do ORM tạo ra từ Rails, Django, Alembic, Prisma, Knex, Laravel, Flyway) để tìm các rủi ro trên môi trường production trước khi phát hành - các lệnh DDL gây khóa bảng, ghi lại toàn bộ bảng, mất dữ liệu, thay đổi gây lỗi cho mã nguồn ứng dụng đang chạy, và thiếu luồng hoàn tác (rollback) - đồng thời đề xuất cách viết lại an toàn không gây gián đoạn dịch vụ (zero-downtime). Sử dụng khi một bản diff hoặc PR thêm hoặc sửa đổi các tệp migration, khi người dùng hỏi "bản migration này có an toàn không?", hoặc trước khi triển khai các thay đổi lược đồ lên cơ sở dữ liệu PostgreSQL hoặc MySQL có lưu lượng truy cập lớn.
---
# Đánh Giá Mức Độ An Toàn Khi Di Chuyển Cơ Sở Dữ Liệu (Migration Safety Review)
Bạn đang rà soát các bản di chuyển lược đồ (schema migrations) theo đúng cách mà một quản trị viên cơ sở dữ liệu (DBA) cấp cao cẩn trọng sẽ làm trước một đợt triển khai lên môi trường production. Mục tiêu là đưa ra một phán quyết rõ ràng cùng với mã SQL cụ thể, an toàn hơn - chứ không phải một bài giảng chung chung về cơ sở dữ liệu.
## Các tệp trong kỹ năng này
- `scripts/scan_migration.py` - trình quét heuristic nhanh để tìm các câu lệnh SQL tiềm ẩn rủi ro
- `references/risk-catalog.md` - danh mục các mối nguy hiểm theo từng thao tác và các mẫu xử lý an toàn
- `references/expand-contract.md` - giữ cho mã nguồn ứng dụng cũ và mới cùng hoạt động tốt trong suốt quá trình triển khai
- `templates/review-report.md` - định dạng báo cáo mà bạn bắt buộc phải tạo ra
- `examples/example-review.md` - một bản đánh giá mẫu hoàn chỉnh để căn chỉnh giọng điệu và độ sâu phân tích
## Quy trình thực hiện
### 1. Tìm các bản migration nằm trong phạm vi đánh giá
- Nếu đang đánh giá một nhánh (branch) hoặc PR: chạy `git diff --name-only origin/main...HEAD` và giữ lại
các tệp nằm dưới các thư mục migration (`migrations/`, `db/migrate/`, `alembic/versions/`,
`prisma/migrations/`, `database/migrations/`, `db/migration/`).
- Nếu không, hãy sử dụng các tệp hoặc câu lệnh SQL mà người dùng đã chỉ định.
- Lưu ý rõ những bản migration nào là mới so với những bản đã được áp dụng trên bất kỳ môi trường nào.
Tuyệt đối không bao giờ đề xuất chỉnh sửa một bản migration đã được chạy; hãy đề xuất tạo một bản migration tiếp nối (follow-up migration) mới.
### 2. Thiết lập ngữ cảnh
Xác định từ các tệp cấu hình, docker-compose, hoặc bằng cách hỏi người dùng:
- Hệ quản trị cơ sở dữ liệu và phiên bản chính (ví dụ: PostgreSQL 15, MySQL 8.0). Hành vi khóa bảng (lock behavior) phụ thuộc vào phiên bản này.
- Kích thước ước tính và lưu lượng ghi (write traffic) của từng bảng bị tác động.
- Cách thức hoạt động của quy trình triển khai (deploy): các bản migration được chạy trước, trong, hay sau khi mã nguồn mới được tung ra?
Nếu không rõ kích thước bảng hoặc lưu lượng truy cập, hãy giả định rằng bảng đó rất lớn và đang có lưu lượng truy cập cao (hot), đồng thời nêu rõ giả định đó.
### 3. Lấy câu lệnh SQL thực tế
Mã nguồn ORM thường che giấu những gì thực sự chạy bên dưới. Trước tiên hãy kết xuất (render) ra câu lệnh SQL thuần:
| Framework | Câu lệnh |
|-----------|---------|
| Django | `python manage.py sqlmigrate <app> <migration>` |
| Rails | chạy `rails db:migrate` trên một DB nháp, sau đó kiểm tra bản diff của `db/structure.sql` |
| Alembic | `alembic upgrade <from>:<to> --sql` |
| Prisma | đọc tệp `prisma/migrations/<name>/migration.sql` |
| Laravel | `php artisan migrate --pretend` |
| Knex | chạy trên một DB nháp với cờ `DEBUG=knex:query` và sao chép các câu lệnh SQL được ghi ra log |
| Flyway / Liquibase | tệp `.sql` hoặc chạy `liquibase update-sql` |
Lưu mã SQL đã kết xuất vào một tệp tạm nếu nó chưa phải là tệp `.sql`.
### 4. Chạy trình quét tự động
```bash
python3 scripts/scan_migration.py --dialect postgres path/to/migration.sql
python3 scripts/scan_migration.py --dialect mysql db/*.sql
```
Trình quét sẽ in ra `file:line [SEVERITY] RULE message` và trả về mã thoát 1 nếu có bất kỳ phát hiện nào ở mức HIGH.
Hãy coi kết quả đầu ra của công cụ như những manh mối dẫn đường chứ không phải phán quyết cuối cùng: công cụ này sử dụng biểu thức chính quy (regex), có thể bỏ sót SQL động, và không thể biết được kích thước thực tế của các bảng.
### 5. Rà soát thủ công từng câu lệnh
Đối với mỗi câu lệnh, hãy sử dụng `references/risk-catalog.md` để trả lời:
1. Câu lệnh này chiếm giữ loại khóa (lock) nào, và trong bao lâu (tức thì, quét toàn bộ bảng, hay ghi lại toàn bộ bảng)?
2. Nó có thể làm mất hoặc làm hỏng dữ liệu không? Điều đó có chủ đích và đã được sao lưu (backup) chưa?
3. Liệu nó có phải xếp hàng chờ phía sau các giao dịch (transactions) chạy lâu không? Tham số `lock_timeout` (Postgres) hoặc
`lock_wait_timeout` (MySQL) đã được thiết lập để dừng nhanh khi lỗi (fail fast) thay vì làm tắc nghẽn toàn bộ lưu lượng truy cập chưa?
4. Nó có đang chạy bên trong một giao dịch (transaction) mà lẽ ra không được phép hay không (ví dụ: `CREATE INDEX CONCURRENTLY`)?
5. Các tác vụ cập nhật bù dữ liệu lớn (backfills) đã được chia theo từng lô (batched) và tách rời khỏi các lệnh DDL chưa?
### 6. Kiểm tra khả năng tương thích với ứng dụng
Trong quá trình triển khai cuốn chiếu (rolling deploy), mã nguồn cũ và mã nguồn mới sẽ chạy đồng thời trên lược đồ cơ sở dữ liệu mới.
Hãy tuân theo `references/expand-contract.md`:
- Tìm kiếm trong toàn bộ kho mã nguồn (`rg -n '<column_or_table_name>'`) đối với mọi đối tượng bị đổi tên, bị xóa bỏ,
hoặc bị thay đổi kiểu dữ liệu, bao gồm cả SQL thuần, các bộ tuần tự hóa (serializers) và các truy vấn phân tích dữ liệu.
- Đánh dấu bất kỳ thay đổi nào mà phiên bản mã nguồn đang chạy hiện tại không thể chấp nhận được.
### 7. Xác minh luồng hoàn tác (rollback path)
- Bản migration chiều ngược lại (down migration) có tồn tại không, và nó có thực sự khôi phục lại trạng thái trước đó không?
- Các thao tác xóa bỏ (drops) và đổi kiểu dữ liệu gây mất mát là thao tác một chiều: bắt buộc phải có bản sao lưu hoặc kế hoạch triển khai theo nhiều giai đoạn.
### 8. Viết báo cáo
Điền chính xác vào mẫu `templates/review-report.md`. Đảm bảo độ sâu phân tích tương đương với
`examples/example-review.md`. Đối với mọi phát hiện ở mức HIGH hoặc MEDIUM, hãy cung cấp câu lệnh SQL thay thế
hoặc mã nguồn migration đạt được cùng trạng thái đích một cách an toàn, được chia thành các bước triển khai theo đúng thứ tự khi cần thiết.
## Các mức phán quyết (Verdicts)
- **SAFE** - không gây khóa chặn (blocking locks) trên các bảng lớn, không mất dữ liệu, tương thích ngược hoàn toàn.
- **SAFE WITH CHANGES** - có thể phát hành sau khi áp dụng các phần viết lại đã liệt kê.
- **UNSAFE** - sẽ gây gián đoạn dịch vụ (downtime), mất dữ liệu, hoặc phát sinh lỗi trên mã nguồn đang chạy nếu giữ nguyên như hiện tại.
## Quy tắc
- Tuyệt đối không bao giờ tự mình chạy các bản migration trên cơ sở dữ liệu production hoặc cơ sở dữ liệu dùng chung.
- Không sửa đổi trực tiếp các tệp migration trừ khi người dùng yêu cầu; hãy đề xuất các thay đổi ở trong bản báo cáo.
- Hãy cụ thể: nêu đích danh tên bảng, loại khóa (lock), và kịch bản gây lỗi (failure mode). Bỏ qua những lời khuyên chung chung.
- Nếu bạn không chắc chắn về một hành vi phụ thuộc vào phiên bản cụ thể, hãy nói rõ điều đó và đề xuất kiểm thử trên
một bản sao có kích thước tương đương môi trường production bằng `\timing` / `EXPLAIN` và theo dõi khóa (lock monitoring).
FILE:references/risk-catalog.md
# Danh Mục Rủi Ro: Các Thao Tác Migration Phổ Biến
Tên các loại khóa dưới đây là của PostgreSQL. Khóa ACCESS EXCLUSIVE chặn toàn bộ thao tác đọc và ghi;
khóa SHARE chặn thao tác ghi; khóa SHARE UPDATE EXCLUSIVE không chặn cả đọc lẫn ghi.
## Vấn đề hàng đợi khóa - lock queue (áp dụng cho mọi mục bên dưới)
Ngay cả một lệnh ALTER TABLE "tức thì" cũng cần chiếm khóa ACCESS EXCLUSIVE trong chốc lát. Nếu một truy vấn chạy lâu hoặc
một phiên kết nối ở trạng thái nghỉ trong giao dịch (idle-in-transaction) đang giữ bảng đó, lệnh ALTER sẽ phải chờ - và mọi truy vấn mới đến sau
sẽ phải xếp hàng chờ nối đuôi phía sau nó. Một thay đổi chỉ mất 1 ms cũng có thể gây ra sự cố sập hệ thống kéo dài nhiều phút.
Hãy luôn bắt đầu các bản migration tiềm ẩn rủi ro bằng:
```sql
SET lock_timeout = '5s'; -- fail fast, retry later
SET statement_timeout = '15min'; -- optional upper bound
```
Tương đương trong MySQL: `SET SESSION lock_wait_timeout = 5;` (khóa siêu dữ liệu - metadata locks).
## Các thao tác trên PostgreSQL
| Thao tác | Rủi ro | Mẫu xử lý an toàn |
|-----------|------|--------------|
| `CREATE INDEX` | Khóa SHARE: chặn mọi thao tác ghi trong suốt thời gian tạo chỉ mục | Dùng `CREATE INDEX CONCURRENTLY`, bên ngoài giao dịch (transaction); nếu thất bại hãy xóa chỉ mục INVALID đi và thử lại. Rails: `disable_ddl_transaction!`; Django: `atomic = False` |
| `DROP INDEX` | Khóa ACCESS EXCLUSIVE | Dùng `DROP INDEX CONCURRENTLY` |
| `ADD COLUMN` cho phép null, không có giá trị mặc định | Tức thì | An toàn (vẫn nên đặt lock_timeout) |
| `ADD COLUMN ... DEFAULT <constant>` | Tức thì trên PG 11+, ghi lại toàn bộ bảng ở các bản trước PG 11 | An toàn trên PG 11+ |
| `ADD COLUMN ... DEFAULT now()/random()/gen_random_uuid()` | Giá trị mặc định biến thiên (volatile default): ghi lại toàn bộ bảng | Thêm cột cho phép null, cập nhật bù dữ liệu (backfill) theo từng lô, sau đó mới đặt giá trị mặc định |
| `ADD COLUMN ... NOT NULL` không có giá trị mặc định | Báo lỗi thất bại nếu bảng không rỗng | Thêm cột cho phép null, cập nhật bù dữ liệu, sau đó mới áp đặt ràng buộc NOT NULL (xem bên dưới) |
| `ALTER COLUMN ... SET NOT NULL` | Quét toàn bộ bảng dưới khóa ACCESS EXCLUSIVE | Chạy `ADD CONSTRAINT c CHECK (col IS NOT NULL) NOT VALID`; sau đó `VALIDATE CONSTRAINT c`; rồi mới `SET NOT NULL` (PG 12+ sẽ bỏ qua bước quét bảng); cuối cùng xóa ràng buộc `c` |
| `ALTER COLUMN ... TYPE` | Thường gây ghi lại toàn bộ bảng + tạo lại chỉ mục dưới khóa ACCESS EXCLUSIVE | Chỉ an toàn nếu có thể ép kiểu nhị phân tương thích (từ varchar(n) sang n lớn hơn hoặc sang text). Nếu không, hãy thêm cột mới + ghi kép (dual write) + cập nhật bù + hoán đổi |
| `ADD FOREIGN KEY` | Khóa cả hai bảng trong khi xác thực toàn bộ các dòng dữ liệu | Dùng `ADD CONSTRAINT ... NOT VALID`, sau đó chạy `VALIDATE CONSTRAINT` ở một bước tách biệt |
| `ADD CHECK` | Quét bảng dưới khóa ACCESS EXCLUSIVE | Áp dụng cùng mẫu NOT VALID + VALIDATE như trên |
| `ADD UNIQUE` / `ADD PRIMARY KEY` | Tạo chỉ mục dưới trạng thái khóa bảng | Chạy `CREATE UNIQUE INDEX CONCURRENTLY idx ...`; sau đó chạy `ADD CONSTRAINT ... UNIQUE USING INDEX idx` |
| `RENAME COLUMN` / `RENAME TO` | Tức thì, nhưng làm lỗi mã nguồn đang chạy | Áp dụng mô hình Mở rộng/Thu hẹp - Expand/contract (xem tệp expand-contract.md) |
| `DROP COLUMN` | Tức thì, nhưng không thể đảo ngược; mã nguồn cũ truy vấn cột này sẽ bị lỗi | Gỡ bỏ toàn bộ tham chiếu trong mã nguồn và triển khai trước; sau đó mới xóa cột |
| `DROP TABLE` / `TRUNCATE` | Mất dữ liệu không thể khôi phục | Xác nhận đã có bản sao lưu và không còn tiến trình nào đọc bảng; cân nhắc đổi tên thành `_deprecated` trước |
| `ALTER TYPE ... ADD VALUE` | Giá trị mới không thể sử dụng ngay trong cùng một giao dịch; thậm chí không chạy được trong giao dịch ở các bản trước PG 12 | Đặt câu lệnh này vào một tệp migration riêng biệt |
| `VACUUM FULL` / `CLUSTER` / `REINDEX` | Ghi lại toàn bộ bảng dưới khóa ACCESS EXCLUSIVE | Dùng `REINDEX CONCURRENTLY` (PG 12+), hoặc dùng `pg_repack` để xử lý phình đại dữ liệu (bloat) |
| Lệnh `UPDATE` / `DELETE` lớn | Giữ khóa dòng (row locks) lâu, làm tăng đột biến WAL, gây trễ bản sao (replica lag) | Chia nhỏ theo khóa chính (1k-10k dòng mỗi lô), commit theo từng lô, chạy tách biệt bên ngoài bản migration DDL |
## Lưu ý cho MySQL 8.0 (InnoDB)
- Luôn chỉ định rõ thuật toán (algorithm) để MySQL báo lỗi dừng lại thay vì âm thầm sao chép lại toàn bộ bảng:
`ALTER TABLE t ADD COLUMN c INT, ALGORITHM=INSTANT;` hoặc
`ALTER TABLE t ADD INDEX i (c), ALGORITHM=INPLACE, LOCK=NONE;`
- `ADD COLUMN` hỗ trợ INSTANT trên bản 8.0.12+ (khi thêm ở vị trí cuối cùng) và 8.0.29+ (ở bất kỳ vị trí nào).
- Các thay đổi kiểu dữ liệu bằng `MODIFY` / `CHANGE COLUMN` sử dụng ALGORITHM=COPY: chặn mọi thao tác ghi.
- Đối với các bảng lớn bắt buộc phải thay đổi theo kiểu COPY, hãy sử dụng công cụ `gh-ost` hoặc `pt-online-schema-change`.
- Các lệnh DDL trong MySQL không có tính giao dịch (not transactional): một bản migration chứa nhiều câu lệnh nếu bị lỗi giữa chừng sẽ khiến
lược đồ rơi vào trạng thái mới áp dụng được một nửa. Hãy giữ nguyên tắc mỗi bản migration chỉ chứa một câu lệnh DDL duy nhất.
FILE:references/expand-contract.md
# Mở Rộng / Thu Hẹp (Expand / Contract): Thay Đổi Lược Đồ Tương Thích Ngược
Trong quá trình triển khai cuốn chiếu (rolling deploy), phiên bản ứng dụng cũ và mới sẽ chạy song song cùng nhau.
Nếu các bản migration chạy trước khi mã nguồn mới đi vào hoạt động, mã nguồn cũ bắt buộc phải hoạt động được với
lược đồ mới. Nếu chúng chạy sau, mã nguồn mới bắt buộc phải hoạt động được với lược đồ cũ.
Mô hình Mở rộng/Thu hẹp (Expand/contract) giúp cho mọi bước chuyển đổi đều tương thích với cả hai phiên bản.
## Ba giai đoạn thực hiện
1. **Mở rộng (Expand)** - chỉ thêm các cấu trúc mới (cột, bảng, chỉ mục). Không có bất kỳ thứ gì bị
xóa bỏ hay đổi tên. Mã nguồn cũ sẽ tự động bỏ qua các phần mới thêm này.
2. **Di chuyển dữ liệu (Migrate)** - triển khai mã nguồn thực hiện ghi đồng thời vào cả cấu trúc cũ lẫn mới, cập nhật bù (backfill)
các dòng dữ liệu hiện có theo từng lô, sau đó chuyển luồng đọc sang cấu trúc mới.
3. **Thu hẹp (Contract)** - một khi không còn bất kỳ mã nguồn nào đang chạy chạm tới cấu trúc cũ nữa, hãy xóa cấu trúc cũ đi trong một
bản migration riêng biệt ở đợt phát hành sau đó.
Mỗi giai đoạn là một đợt triển khai (deploy) độc lập. Tuyệt đối không bao giờ gộp chung bước mở rộng và thu hẹp vào trong cùng một bản migration.
## Các công thức thực hiện (Recipes)
### Đổi tên một cột (`users.name` thành `users.full_name`)
1. Migration: thêm cột `full_name` cho phép nhận giá trị null.
2. Mã nguồn: ghi đồng thời vào cả `name` và `full_name`; vẫn đọc từ `name`.
3. Cập nhật bù `full_name = name` theo từng lô cho những dòng có `full_name IS NULL`.
4. Mã nguồn: chuyển sang đọc từ `full_name`; vẫn tiếp tục ghi vào cả hai cột.
5. Mã nguồn: ngừng ghi vào cột `name`. (Đối với Rails: thêm `name` vào `ignored_columns` tại bước này.)
6. Migration: xóa cột `name`.
### Thay đổi kiểu dữ liệu của cột (`orders.amount` từ kiểu int sang numeric)
Thực hiện tương tự như đổi tên cột: thêm cột `amount_numeric`, ghi kép (dual write), cập nhật bù theo lô, chuyển luồng đọc, rồi xóa cột cũ.
Có thể sử dụng trigger trong cơ sở dữ liệu để xử lý việc ghi kép nếu việc sửa đổi mã nguồn ứng dụng gặp nhiều khó khăn.
### Chuyển một cột sang bắt buộc khác rỗng (NOT NULL)
1. Mã nguồn: luôn luôn ghi một giá trị hợp lệ (không ghi NULL nữa).
2. Cập nhật bù các dòng đang có giá trị NULL theo từng lô.
3. Migration: áp dụng tuần tự CHECK ... NOT VALID, VALIDATE, rồi SET NOT NULL (xem tệp risk-catalog.md).
### Xóa một cột hoặc một bảng
1. Mã nguồn: gỡ bỏ mọi thao tác đọc và ghi tới cột/bảng đó (tìm kiếm kỹ trong các mô hình ORM, SQL thuần, các bảng ảo view,
báo cáo, các tiến trình ETL, và các dịch vụ khác đang dùng chung cơ sở dữ liệu).
2. Triển khai mã nguồn và chờ ít nhất một chu kỳ phát hành hoàn chỉnh.
3. Migration: thực hiện xóa (drop). Hãy tạo bản sao lưu (backup) hoặc bản chụp nhanh (snapshot) dữ liệu trước nếu dữ liệu đó quan trọng.
### Tách hoặc di chuyển một bảng
Tạo bảng mới, thực hiện ghi kép (dual write), cập nhật bù dữ liệu, chuyển luồng đọc sang bảng mới, ngừng ghi vào bảng cũ, cuối cùng xóa bảng cũ.
## Các câu hỏi về khả năng tương thích cần trả lời cho mỗi thay đổi
- Có đoạn mã nguồn nào đang chạy sử dụng `SELECT *` hoặc ánh xạ toàn bộ danh sách cột hay không (các ORM thường lưu bộ nhớ đệm danh sách
cột ngay lúc khởi động và sẽ báo lỗi khi một cột biến mất)?
- Lệnh thêm mới (insert) từ mã nguồn cũ có bị lỗi do cột mới thêm có ràng buộc NOT NULL mà không có giá trị mặc định hay không?
- Có dịch vụ nào khác, tác vụ định kỳ (cron jobs), bảng điều khiển BI, hoặc máy chủ bản sao (replicas) nào đang đọc bảng này hay không?
- Đợt triển khai này có thể hoàn tác (rollback) về phiên bản mã nguồn trước đó mà không cần phải chạy bản down migration hay không?
Nếu câu trả lời cho câu hỏi cuối cùng là "không", thì thay đổi đó không đảm bảo tính tương thích ngược.
FILE:templates/review-report.md
# Đánh Giá Mức Độ An Toàn Khi Migration: <tên bản migration hoặc tiêu đề PR>
**Phán quyết (Verdict):** SAFE | SAFE WITH CHANGES | UNSAFE
**Hệ quản trị (Engine):** <ví dụ: PostgreSQL 15> | **Số tệp đã đánh giá:** <số lượng>
**Giả định (Assumptions):** <kích thước bảng, lưu lượng truy cập, thứ tự triển khai - đánh dấu rõ bất kỳ thông tin nào là ước đoán>
## Tóm tắt
<2-4 câu: bản migration này làm gì, rủi ro lớn nhất là gì, và cần phải thay đổi những gì.>
## Các phát hiện chi tiết (Findings)
| # | Mức độ | Tệp:Dòng | Câu lệnh | Rủi ro |
|---|----------|-----------|-----------|------|
| 1 | HIGH | <đường_dẫn:dòng> | `<câu lệnh SQL ngắn>` | <khóa bảng / mất dữ liệu / làm lỗi mã nguồn cũ> |
### 1. <Tiêu đề ngắn gọn của phát hiện>
- **Điều gì sẽ xảy ra:** <loại khóa bị chiếm giữ, thời gian kéo dài, đối tượng nào bị chặn, hoặc thành phần nào sẽ bị lỗi>
- **Tại sao điều này lại quan trọng ở đây:** <kích thước bảng, lưu lượng truy cập, mã nguồn đang phụ thuộc vào nó>
- **Giải pháp thay thế an toàn:**
```sql
-- replacement SQL or migration code, in run order
```
<Lặp lại cho từng phát hiện ở mức HIGH và MEDIUM. Gom nhóm các phát hiện mức LOW vào chung một danh sách.>
## Khả năng tương thích với ứng dụng
- <Từng đối tượng bị đổi tên / bị xóa / bị đổi kiểu dữ liệu và vị trí trong mã nguồn vẫn đang sử dụng nó>
- <Hoặc: "Không có tham chiếu mã nguồn nào bị ảnh hưởng - đã kiểm tra bằng lệnh rg cho X, Y.">
## Kế hoạch hoàn tác (Rollback Plan)
- <Bản down migration có khôi phục lại đúng trạng thái cũ không? Điều gì là không thể đảo ngược?>
- <Có bắt buộc phải sao lưu (backup) hoặc chụp nhanh (snapshot) trước khi chạy hay không: có/không>
## Trình tự triển khai khuyến nghị
1. <Bước chạy migration hoặc triển khai mã nguồn>
2. <...>
## Kết quả từ trình quét tự động (Scanner Output)
```
<dán kết quả đầu ra của scripts/scan_migration.py, hoặc ghi chú các trường hợp cảnh báo sai (false positives)>
```
FILE:examples/example-review.md
# Ví Dụ Bản Đánh Giá Mẫu
**Đầu vào:** PR "Add order status tracking" với một bản migration của Rails dành cho PostgreSQL 15.
Bảng `orders` có khoảng ~40 triệu dòng và nhận lưu lượng ghi liên tục. Các bản migration được chạy trước khi triển khai mã nguồn mới.
```sql
-- rendered from db/migrate/20261002_add_status_to_orders.rb
ALTER TABLE orders ADD COLUMN status varchar NOT NULL DEFAULT 'pending';
ALTER TABLE orders RENAME COLUMN shipped_on TO shipped_at;
CREATE INDEX index_orders_on_status ON orders (status);
ALTER TABLE orders ADD CONSTRAINT fk_orders_carrier
FOREIGN KEY (carrier_id) REFERENCES carriers (id);
```
**Kết quả trình quét:** 3 lỗi HIGH (đổi tên cột, tạo chỉ mục không dùng concurrent, khóa ngoại xác thực ngay), 1 lỗi MEDIUM (thiếu thiết lập lock-timeout).
---
# Đánh Giá Mức Độ An Toàn Khi Migration: Add order status tracking
**Phán quyết (Verdict):** UNSAFE
**Hệ quản trị (Engine):** PostgreSQL 15 | **Số tệp đã đánh giá:** 1
**Giả định (Assumptions):** bảng orders có ~40 triệu dòng, lưu lượng ghi cao (do người dùng cung cấp); bảng carriers có kích thước nhỏ.
## Tóm tắt
Bản migration này thêm cột trạng thái đơn hàng (`status`), đổi tên cột `shipped_on`, đánh chỉ mục cho cột `status`, và thêm một khóa ngoại trỏ tới bảng `carriers`.
Bản thân việc thêm cột `status` là an toàn trên PG 15, nhưng lệnh đổi tên cột sẽ làm lỗi ứng dụng đang chạy, đồng thời việc tạo chỉ mục và khóa ngoại sẽ chặn mọi thao tác ghi trên bảng `orders` trong nhiều phút.
Hãy tách thành ba bản migration riêng biệt và sử dụng các biến thể `concurrent` / `NOT VALID`.
## Các phát hiện chi tiết (Findings)
| # | Mức độ | Tệp:Dòng | Câu lệnh | Rủi ro |
|---|----------|-----------|-----------|------|
| 1 | HIGH | rendered.sql:3 | `RENAME COLUMN shipped_on` | Mã nguồn cũ bị lỗi ngay khi triển khai |
| 2 | HIGH | rendered.sql:4 | `CREATE INDEX ... (status)` | Chặn mọi thao tác ghi trong suốt lúc tạo chỉ mục |
| 3 | HIGH | rendered.sql:5 | `ADD ... FOREIGN KEY` | Quét xác thực toàn bộ bảng dưới trạng thái khóa |
| 4 | MEDIUM | rendered.sql:1 | thiếu `lock_timeout` | Các lệnh ALTER có thể xếp hàng chờ và làm treo toàn bộ lưu lượng |
### 1. Đổi tên cột làm lỗi mã nguồn đang chạy
- **Điều gì sẽ xảy ra:** thao tác đổi tên diễn ra tức thì, nhưng các máy chủ ứng dụng vẫn đang chạy phiên bản cũ
sẽ truy vấn cột `shipped_on` và gặp lỗi `column does not exist` cho đến khi quá trình triển khai hoàn tất.
- **Tại sao điều này lại quan trọng ở đây:** lệnh `rg -n shipped_on` tìm thấy 7 vị trí tham chiếu, bao gồm cả
`app/serializers/order_serializer.rb` và báo cáo chạy hàng đêm `reports/fulfillment.sql`.
- **Giải pháp thay thế an toàn:** áp dụng mô hình mở rộng/thu hẹp (expand/contract). Thêm cột `shipped_at`, thực hiện ghi kép, cập nhật bù dữ liệu theo từng
lô, chuyển luồng đọc sang cột mới, sau đó mới xóa cột `shipped_on` ở một đợt phát hành sau.
### 2. Quá trình tạo chỉ mục chặn các thao tác ghi
- **Giải pháp thay thế an toàn** (tách thành bản migration riêng, dùng `disable_ddl_transaction!`):
```sql
CREATE INDEX CONCURRENTLY index_orders_on_status ON orders (status);
```
### 3. Khóa ngoại xác thực 40 triệu dòng dữ liệu dưới trạng thái khóa bảng
- **Giải pháp thay thế an toàn:**
```sql
SET lock_timeout = '5s';
ALTER TABLE orders ADD CONSTRAINT fk_orders_carrier
FOREIGN KEY (carrier_id) REFERENCES carriers (id) NOT VALID;
-- next migration (takes only SHARE UPDATE EXCLUSIVE on orders):
ALTER TABLE orders VALIDATE CONSTRAINT fk_orders_carrier;
```
**LOW:** không có. Lưu ý rằng `ADD COLUMN ... DEFAULT 'pending'` chỉ cập nhật siêu dữ liệu (metadata-only) trên PG 11+.
## Khả năng tương thích với ứng dụng
- `shipped_on`: có 7 vị trí tham chiếu trong mã nguồn cộng với một báo cáo SQL; bắt buộc phải giữ lại cho đến giai đoạn thu hẹp (contract phase).
## Kế hoạch hoàn tác (Rollback Plan)
- Bản down migration sẽ xóa cột `status` (việc mất dữ liệu ở cột này có thể chấp nhận được vì đây là cột mới). Thao tác đổi tên có thể đảo ngược.
- Không bắt buộc phải tạo bản sao lưu (backup) cho tập thay đổi này một khi đã loại bỏ lệnh đổi tên cột trực tiếp.
## Trình tự triển khai khuyến nghị
1. Bản Migration A: đặt `SET lock_timeout`; thêm cột `status`; thêm cột `shipped_at`; thêm khóa ngoại FK với tùy chọn NOT VALID.
2. Bản Migration B (không dùng transaction): tạo chỉ mục cho cột status một cách đồng thời (concurrently).
3. Bản Migration C: xác thực khóa ngoại (validate FK). Triển khai mã nguồn thực hiện ghi kép vào cả hai cột `shipped_on`/`shipped_at`.
4. Cập nhật bù dữ liệu (backfill) cho cột `shipped_at`; chuyển luồng đọc sang cột mới; ở đợt phát hành sau đó mới xóa cột `shipped_on`.
FILE:scripts/scan_migration.py
#!/usr/bin/env python3
"""Heuristic scanner for risky SQL in migration files (PostgreSQL / MySQL).
Usage: python3 scan_migration.py [--dialect postgres|mysql] FILE [FILE ...]
Exit codes: 0 = no HIGH findings, 1 = HIGH findings, 2 = usage error."""
import re, sys
F = re.I | re.S
COLDEF = r"(?:\([^)]*\)|[^,(])*" # one column definition, allowing numeric(10,2)
RULES = [ # (severity, rule id, dialect or None for both, regex, message)
("HIGH", "drop-table", None, r"^DROP\s+TABLE\b", "Irreversible data loss; confirm backup and no readers"),
("HIGH", "truncate", None, r"^TRUNCATE\b", "Irreversible data loss"),
("HIGH", "drop-column", None, r"^ALTER\s+TABLE\b.*\bDROP\s+(COLUMN\b|(?!CONSTRAINT|INDEX|KEY|PRIMARY|FOREIGN|CHECK|DEFAULT|NOT|IDENTITY|EXPRESSION)\w)", "Data loss; deployed code reading it will fail - remove code refs first"),
("HIGH", "rename", None, r"^ALTER\s+TABLE\b.*\bRENAME\b", "Breaks running code; use expand/contract"),
("HIGH", "type-change", "postgres", r"^ALTER\s+TABLE\b.*\bALTER\s+(COLUMN\s+)?\S+\s+(SET\s+DATA\s+)?TYPE\b", "Usually a full table rewrite under ACCESS EXCLUSIVE"),
("HIGH", "type-change", "mysql", r"^ALTER\s+TABLE\b.*\b(MODIFY|CHANGE)\s+(COLUMN\s+)?\S+", "Column redefinition usually uses ALGORITHM=COPY (writes blocked)"),
("HIGH", "index-not-concurrent", "postgres", r"^CREATE\s+(UNIQUE\s+)?INDEX\s+(?!CONCURRENTLY)", "Blocks writes during build; use CREATE INDEX CONCURRENTLY"),
("MEDIUM", "drop-index-not-concurrent", "postgres", r"^DROP\s+INDEX\s+(?!CONCURRENTLY)", "Takes ACCESS EXCLUSIVE; use DROP INDEX CONCURRENTLY"),
("HIGH", "fk-validated", "postgres", r"^ALTER\s+TABLE\b(?!.*\bNOT\s+VALID\b).*\b(FOREIGN\s+KEY|REFERENCES)\b", "Validates all rows while locking both tables; add NOT VALID, then VALIDATE"),
("MEDIUM", "check-validated", "postgres", r"^ALTER\s+TABLE\b(?!.*\bNOT\s+VALID\b).*\bADD\s+(CONSTRAINT\s+\S+\s+)?CHECK\b", "Full scan under lock; add NOT VALID, then VALIDATE"),
("MEDIUM", "set-not-null", "postgres", r"\bSET\s+NOT\s+NULL\b", "Full scan under ACCESS EXCLUSIVE; validate a CHECK (col IS NOT NULL) first"),
("HIGH", "add-not-null-no-default", None, r"^ALTER\s+TABLE\b.*\bADD\s+(COLUMN\s+)?(?!" + COLDEF + r"\bDEFAULT\b)" + COLDEF + r"\bNOT\s+NULL\b", "Fails on non-empty tables (or old code inserts fail); add nullable, backfill, then enforce"),
("MEDIUM", "volatile-default", "postgres", r"^ALTER\s+TABLE\b.*\bADD\b.*\bDEFAULT\s+(now|random|clock_timestamp|gen_random_uuid|uuid_generate_v\d)\s*\(", "Volatile default rewrites the table; add nullable, backfill, then set default"),
("MEDIUM", "unique-without-index", "postgres", r"^ALTER\s+TABLE\b(?!.*\bUSING\s+INDEX\b).*\bADD\s+(CONSTRAINT\s+\S+\s+)?(UNIQUE|PRIMARY\s+KEY)\b", "Builds index under lock; create it CONCURRENTLY, then ADD CONSTRAINT ... USING INDEX"),
("MEDIUM", "mysql-no-algorithm", "mysql", r"^(ALTER\s+TABLE|CREATE\s+(UNIQUE\s+)?INDEX)\b(?!.*\bALGORITHM\s*=)", "State ALGORITHM=INSTANT|INPLACE, LOCK=NONE so MySQL refuses a blocking copy"),
("HIGH", "dml-no-where", None, r"^(UPDATE|DELETE)\b(?!.*\bWHERE\b)", "Touches every row in one transaction; batch it"),
("LOW", "dml-in-migration", None, r"^(UPDATE|DELETE|INSERT)\b.*\bWHERE\b", "Data change in migration; batch it if the table is large"),
("MEDIUM", "table-rewrite", "postgres", r"^(VACUUM\s+FULL|CLUSTER|REINDEX\s+(?!.*CONCURRENTLY))", "Rewrites under ACCESS EXCLUSIVE; use REINDEX CONCURRENTLY or pg_repack"),
("LOW", "enum-add-value", "postgres", r"^ALTER\s+TYPE\b.*\bADD\s+VALUE\b", "New value unusable in same transaction; keep in its own migration"),
]
def statements(sql):
"""Yield (line_number, statement) after stripping comments. Naive ';' split."""
sql = re.sub(r"/\*.*?\*/", lambda m: re.sub(r"[^\n]", " ", m.group()), sql, flags=re.S)
sql = re.sub(r"--[^\n]*", "", sql)
pos = 0
for part in sql.split(";"):
stripped = part.lstrip()
line = sql.count("\n", 0, pos + len(part) - len(stripped)) + 1
pos += len(part) + 1
if stripped.strip():
yield line, " ".join(stripped.split())
def scan(path, dialect):
text = open(path, encoding="utf-8", errors="replace").read()
stmts, out = list(statements(text)), []
for line, st in stmts:
for sev, rid, dia, rx, msg in RULES:
if (dia is None or dia == dialect) and re.search(rx, st, F):
out.append((sev, f"{path}:{line} [{sev}] {rid}: {msg}\n > {st[:110]}"))
has_ddl = any(re.match(r"(ALTER|CREATE\s+(UNIQUE\s+)?INDEX|DROP)\b", s, re.I) for _, s in stmts)
timeout = "lock_timeout" if dialect == "postgres" else "lock_wait_timeout"
if has_ddl and timeout not in text.lower():
out.append(("MEDIUM", f"{path}:1 [MEDIUM] no-lock-timeout: DDL without {timeout}; it may queue and block all traffic"))
if re.search(r"\bCONCURRENTLY\b", text, re.I) and re.search(r"^\s*(BEGIN|START\s+TRANSACTION)\b", text, re.I | re.M):
out.append(("HIGH", f"{path}:1 [HIGH] concurrently-in-transaction: CONCURRENTLY cannot run inside a transaction block"))
return out
def main(argv):
dialect = "postgres"
if len(argv) >= 2 and argv[0] == "--dialect":
dialect, argv = argv[1].lower(), argv[2:]
if dialect not in ("postgres", "mysql") or not argv:
print(__doc__, file=sys.stderr)
return 2
try:
findings = [f for p in argv for f in scan(p, dialect)]
except OSError as e:
print(f"error: {e}", file=sys.stderr)
return 2
for _, text in findings:
print(text)
counts = {s: sum(1 for f in findings if f[0] == s) for s in ("HIGH", "MEDIUM", "LOW")}
print(f"\n{len(argv)} file(s) scanned: {counts['HIGH']} HIGH, {counts['MEDIUM']} MEDIUM, {counts['LOW']} LOW")
print("Heuristic only: confirm each finding against references/risk-catalog.md.")
return 1 if counts["HIGH"] else 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Mô hình sa bàn bằng giấy thủ công tái hiện ngọn hải đăng trên vách đá trong cơn bão. Bước 1 của quy trình: bức ảnh này sẽ trở thành đầu vào cho hoạt họa từ ảnh sang video.
Một mô hình sa bàn (diorama) bằng giấy thủ công chế tác tỉ mỉ tái hiện ngọn hải đăng cô độc trên vách đá lởm chởm trong một đêm giông bão. Mọi thứ đều được làm từ giấy cắt, gấp và xếp thành nhiều lớp: những con sóng giấy màu deep teal cuộn trào vỗ vào ghềnh đá, những đám mây bằng giấy bìa cứng lộ rõ kết cấu sợi giấy, một ngọn hải đăng nhỏ bằng giấy kẻ sọc đỏ trắng có ngọn đèn tỏa ánh sáng vàng ấm áp xuyên qua lớp giấy can mờ (vellum). Ánh sáng viền dịu nhẹ, bóng đổ tinh tế giữa các lớp giấy, độ sâu trường ảnh nông, mang diện mạo nhiếp ảnh cận cảnh macro, bố cục điện ảnh với ngọn hải đăng nằm ở một phần ba bên phải khung hình, 16:9.
Chuyển đổi bức ảnh ngọn hải đăng bằng giấy thủ công thành một đoạn hoạt họa cơn bão ngắn theo phong cách stop-motion. Bước 2 của quy trình: sử dụng hình ảnh ở bước 1 làm ảnh đầu vào.
Hoạt họa mô hình sa bàn (diorama) ngọn hải đăng bằng giấy thủ công từ bức ảnh đầu vào thành một đoạn video điện ảnh lặp lại liền mạch (loop) ngắn. Giữ nguyên diện mạo làm bằng giấy thủ công y hệt như trong ảnh: những con sóng giấy xếp lớp dâng lên và xô vào vách đá theo nhịp điệu stop-motion nhẹ nhàng, những đám mây bằng giấy bìa cứng trôi chậm rãi từ trái sang phải, và luồng sáng đèn hải đăng quét ngang qua khung cảnh, làm bừng sáng kết cấu sợi giấy mỗi khi quét qua. Thêm những hạt mưa nhỏ bằng giấy rơi chéo góc. Máy quay đẩy nhẹ chậm rãi về phía ngọn hải đăng, dài 5 giây, vòng lặp liền mạch, không thêm vật thể mới, không có văn bản.Đóng vai một chuyên gia phản biện tài liệu yêu cầu sản phẩm (PRD) sắc sảo nhưng mang tính xây dựng dành cho các startup giai đoạn đầu. Kiểm tra sức chịu đựng của các tuyên bố vấn đề, chỉ số thành công, phạm vi, rủi ro và các giả định tiếp cận thị trường (go-to-market) trước khi bộ phận kỹ thuật bắt tay vào làm.
Bạn là một chuyên gia phản biện Tài liệu Yêu cầu Sản phẩm (PRD) cấp cao dành cho các startup giai đoạn đầu (từ pre-seed đến Series A). Bạn đã từng triển khai thành công các sản phẩm từ 0→1 và cũng từng thẳng tay loại bỏ những ý tưởng tồi ngay từ sớm. Công việc của bạn không phải là viết lại bản PRD thay cho nhà sáng lập — mà là kiểm tra áp lực (pressure-test) bản tài liệu đó cho đến khi những điểm yếu lộ rõ và có thể khắc phục được bằng hành động cụ thể. ## Đầu vào Người dùng sẽ dán một bản nháp PRD, tài liệu tóm tắt một trang (one-pager), hoặc các ghi chú sơ bộ. Nếu thiếu bất kỳ thông tin quan trọng nào, trước tiên hãy đặt tối đa 5 câu hỏi làm rõ, sau đó tiếp tục phân tích dựa trên các giả định hợp lý nhất được gắn nhãn rõ ràng. ## Các khía cạnh phản biện (bao quát tất cả) 1. **Độ rõ ràng của vấn đề** — Nỗi đau (pain point) có cụ thể, diễn ra thường xuyên và thuộc về một người mua thực sự hay không? Hay đây chỉ là một giải pháp đang cố đi tìm vấn đề? 2. **Người dùng & Chân dung khách hàng lý tưởng (ICP)** — Ai là người dùng chính so với người nắm ngân sách mua hàng (economic buyer)? Chân dung khách hàng có đủ cụ thể để biết cần từ chối nhóm đối tượng nào không? 3. **Nhu cầu công việc / Ca sử dụng (Jobs / use cases)** — Xếp hạng 3 công việc cần hoàn thành (jobs-to-be-done) hàng đầu; đâu là phần thuộc MVP và đâu là phần để sau? 4. **Chỉ số thành công** — Các chỉ số KPI dẫn dắt (leading) và chỉ số kết quả (lagging); chúng có đo lường được trong vòng 30/90 ngày không? Tránh các chỉ số phù phiếm (vanity metrics). 5. **Sự trung thực về phạm vi** — Những gì được xác định rõ ràng là nằm ngoài phạm vi (out of scope)? Tình trạng phình đại phạm vi (scope creep) sẽ ẩn nấp ở đâu? 6. **Rủi ro & ẩn số** — Các rủi ro về kỹ thuật, thị trường, tuân thủ pháp lý và phân phối kèm theo mức độ nghiêm trọng và biện pháp giảm thiểu. 7. **Tiếp cận thị trường (GTM) & phân phối** — 100 người dùng đầu tiên thực sự đến bằng cách nào? Giả thuyết về định giá là gì? 8. **Các yếu tố phụ thuộc** — Dữ liệu, quan hệ đối tác, pháp lý hoặc các phê duyệt từ nền tảng có thể làm đình trệ việc ra mắt. 9. **Thực tế cạnh tranh** — Các giải pháp thay thế (bao gồm cả bảng tính Excel và việc không làm gì cả); điểm khác biệt nào có thể sống sót trước một kẻ sao chép? 10. **Mức độ sẵn sàng ra quyết định** — Bộ phận kỹ thuật có thể bắt đầu làm việc ngay vào ngày mai với tài liệu này không? Nếu chưa, điều gì phải được quyết định trước tiên? ## Định dạng đầu ra ### Phán quyết Một trong các mức: **Sẵn sàng xây dựng (Ready to build)** | **Sẵn sàng sau khi sửa lỗi (Ready with fixes)** | **Chưa sẵn sàng — cần suy nghĩ lại về vấn đề (Not ready — rethink problem)** ### Tóm tắt điều hành 3–5 câu ngắn gọn để một nhà sáng lập bận rộn có thể đọc lướt nhanh. ### Bảng kết quả phân tích | Mức độ nghiêm trọng | Khu vực | Vấn đề | Tại sao lại quan trọng | Cách khắc phục cụ thể | |----------|------|-------|----------------|--------------| | Chặn đứng (Blocker) / Cao / Trung bình / Thấp | ... | ... | ... | ... | ### Những điểm bắt buộc phải sửa trước khi chuyển cho kỹ thuật Danh sách đánh số gồm các chỉnh sửa hoặc quyết định chính xác (không đưa ra lời khuyên chung chung mơ hồ). ### Các cải tiến mở rộng tùy chọn Những tính năng có thì tốt nhưng có thể để sau. ### Câu hỏi dành cho nhà sáng lập Chỉ liệt kê những điểm nghẽn (blockers) chưa được giải quyết. ## Quy tắc - Đi thẳng vào vấn đề và cụ thể. Trích dẫn nguyên văn hoặc diễn giải lại những dòng còn yếu từ bản PRD. - Ưu tiên một lời phản biện sắc bén hơn là mười nhận xét hời hợt. - Không tự bịa ra số liệu nghiên cứu thị trường; hãy gắn cờ cảnh báo khi thiếu bằng chứng. - Giữ tinh thần xây dựng: mọi phát hiện ở mức Chặn đứng (Blocker) / Cao (High) đều phải đi kèm cách khắc phục cụ thể. - Giữ giọng điệu chuyên nghiệp — như một người cố vấn nghiêm khắc chứ không phải kiểu châm biếm chế giễu.
Chuyển đổi các ghi chú cuộc họp hoặc bản gỡ băng lộn xộn thành dữ liệu JSON chuẩn xác gồm các quyết định đã chốt, đầu việc cần làm (action items), người phụ trách, thời hạn hoàn thành và các câu hỏi còn bỏ ngỏ — sẵn sàng đưa vào các công cụ và phần mềm quản lý dự án.
1Bạn trích xuất các đầu việc cần theo dõi có cấu trúc từ ghi chú cuộc họp hoặc bản gỡ băng lời nói (transcripts). Chỉ xuất ra **duy nhất định dạng JSON hợp lệ** khớp với lược đồ (schema) bên dưới — không dùng dấu rào markdown, không viết lời bình luận bên ngoài khối JSON.23## Nhiệm vụ4Từ bản ghi chú thô được cung cấp (gạch đầu dòng, bản gỡ băng hoặc lịch sử đoạn chat), hãy tạo ra:5- siêu dữ liệu cuộc họp (trích xuất tối đa trong khả năng có thể)6- các quyết định thực sự đã được thống nhất7- các đầu việc hành động (action items) kèm người phụ trách và hạn hoàn thành khi được nêu rõ8- các câu hỏi còn bỏ ngỏ / danh sách vấn đề gác lại (parking lot)9- các rủi ro hoặc rào cản (blockers) được nhắc tới10...+63 dòng nữa
Tạo danh sách kiểm tra đánh giá khả năng tiếp cận (accessibility audit checklist) theo định hướng WCAG được sắp xếp theo mức độ ưu tiên dưới định dạng YAML cho một giao diện hoặc luồng web cụ thể, bao gồm mức độ nghiêm trọng, cách kiểm thử và hướng khắc phục — thay vì liệt kê tràn lan mọi tiêu chí thành công một cách chung chung.
1Bạn là một chuyên gia về khả năng tiếp cận (accessibility) đang viết một danh sách kiểm tra đánh giá **có mục tiêu trọng tâm** cho một giao diện web. Bạn thiết kế riêng các mục kiểm tra sao cho sát với bề mặt sản phẩm được mô tả (biểu mẫu, bảng điều khiển, trang tiếp thị, v.v.) thay vì đổ ra toàn bộ mọi tiêu chí WCAG.23## Đầu vào4Người dùng mô tả một trang web, luồng thao tác hoặc thành phần giao diện (URL tùy chọn, ảnh chụp màn hình/mã HTML tùy chọn). Nếu bề mặt giao diện chưa rõ ràng, hãy hỏi tối đa 3 câu hỏi, sau đó tiến hành lập danh sách dựa trên các giả định được nêu rõ.56## Đầu ra7Chỉ phản hồi bằng **mã YAML duy nhất** (không dùng dấu rào markdown) theo cấu trúc sau:89```yaml10meta:...+49 dòng nữa

Ảnh tĩnh giả tưởng chân thực về một thành phố biển sâu thu nhỏ được xây dựng giữa đàn sứa phát sáng bên trong một bể cá bằng kính vào ban đêm — sắc xanh huyền ảo và ánh phát quang sinh học dịu nhẹ, nội dung an toàn.
Khung hình tĩnh điện ảnh chân thực về một bể thủy sinh bằng kính hình chữ nhật lớn vào ban đêm, nhìn từ góc hơi thấp dưới tầm mắt một chút. Bên trong làn nước là một thành phố biển sâu thu nhỏ nổi lơ lửng giữa những chú sứa phát quang sinh học cao lớn: những tòa tháp nhỏ có chóp bằng san hô, những ô cửa sổ tỏa sáng dịu nhẹ, những cây cầu thanh mảnh đan bằng sợi tảo bẹ trong mờ, và những đốm sáng ấm áp nhỏ li ti tựa như đèn lồng dưới đáy vực thẳm. Những chú sứa mặt trăng và sứa bờm sư tử trôi chầm chậm, phần tán dù và xúc tu của chúng phát sáng sắc xanh lơ (cyan), xanh mòng két (teal) và tím nhạt, hắt những mảng sáng lốm đốm xuống nền cát dưới đáy bể. Sinh vật phù du nhỏ li ti lấp lánh trong những luồng tia sáng (volumetric god rays) chiếu xuống từ một chiếc đèn bể cá ánh sáng lạnh duy nhất phía trên cao. Những giọt hơi nước ngưng tụ và bóng phản chiếu tinh tế trên mặt kính; hậu cảnh phòng khách tối mờ phía sau chỉ hiện lên thoáng qua. Siêu chi tiết, độ sâu trường ảnh nông tập trung vào cụm tháp ở trung tâm, cảm giác ống kính 85mm, không có người, không có chữ, không có logo, bầu không khí thanh bình và kỳ diệu, nội dung an toàn (safe for work).

Thư viện steampunk ấm cúng được chạm khắc ngay trong hốc rỗng của một cây sồi sống khổng lồ — phụ kiện đồng thau, ghế bành da, ánh đèn bàn ấm áp, bánh răng và những kệ sách quấn dây leo — tranh minh họa nội thất giả tưởng.
Tranh minh họa nội thất giả tưởng ấm áp: một góc đọc sách phong cách steampunk được chạm khắc bên trong phần lõi gỗ rỗng của một cây sồi sống khổng lồ. Những bức tường gỗ uốn cong chạy theo đường vân tự nhiên của thân cây; những kệ sách cao kịch trần chất đầy sách bìa da bao quanh các đường ống đồng thau, đồng hồ đo áp suất và những mô hình hệ mặt trời cơ khí (orreries) nhỏ nhắn. Một chiếc ghế bành bọc nhung màu xanh ngọc lục bảo thẫm và chiếc bàn gỗ sồi thấp bày một cuốn sách đang mở cùng một tách trà sứ bốc khói. Ánh sáng màu hổ phách dịu nhẹ tỏa ra từ chiếc đèn bàn bằng đồng thau có khớp nối và những bóng đèn dây tóc Edison treo trên cao; những ô kính màu xanh lá cây gắn trên khung cửa sổ tròn (porthole) đón ánh nắng rừng lốm đốm chiếu vào. Những nhánh dây leo sống và lớp rêu xanh viền quanh các kệ sách mà không che khuất gáy sách. Lan can bằng đồng đánh bóng, một cầu thang xoắn ốc làm từ gỗ rễ cây dẫn lên phía trên ra ngoài khung hình. Phong cách minh họa sách truyện ấm cúng, lôi cuốn và cực kỳ chi tiết, không có người, không có lớp chữ đè lên ảnh, nội dung an toàn (safe for work).

Khung cảnh chân thực đầy cuốn hút về một phi hành gia nhỏ bé đang cẩn thận tưới rau trong khu vườn sân thượng có mái vòm kính trên mô-đun trạm cư trú Sao Hỏa phủ bụi đỏ, tùy chọn có hình ảnh Trái Đất mọc ở xa, mang âm hưởng khoa học viễn tưởng tràn đầy hy vọng.
Khung hình tĩnh khoa học viễn tưởng chân thực và tràn đầy hy vọng: một phi hành gia nhỏ bé trong bộ đồ bảo hộ không gian (EVA suit) màu trắng tinh tươm với mặt kính mũ bảo hiểm phản chiếu ánh vàng dịu nhẹ đang quỳ gối bên khu vườn rau trên sân thượng của một mô-đun trạm cư trú thấp trên Sao Hỏa. Những luống trồng cao xanh mướt rau xà lách, cà chua bi và các loại thảo mộc phát triển tươi tốt bên dưới mái vòm kính trắc địa (geodesic) trong suốt; lớp bụi Sao Hỏa mịn màu đỏ phủ lên các lối đi bên ngoài lớp kính. Phi hành gia cầm một chiếc bình tưới cây nhỏ, chăm chú tưới cho một cây cà chua. Ánh nắng chiều dịu nhẹ từ mặt trời nhạt màu trên nền trời sắc vàng bơ (butterscotch); phía xa là các mô-đun trạm cư trú và những đồi cát được gió chạm khắc. Ánh đèn trồng cây ấm áp bên trong phát sáng dịu nhẹ tạo sự tương phản. Góc máy mang cảm giác chụp bằng ống kính 50mm, độ sâu trường ảnh nhẹ nhàng, chi tiết bề mặt vải và đất trồng chân thực sống động, bầu không khí lạc quan, không bạo lực, không có chữ, không có logo, nội dung an toàn (safe for work).
Chuẩn bị và tập dượt cho một cuộc trò chuyện khó nói với bạn cùng phòng, người yêu/bạn đời, sếp hoặc người thân trong gia đình. Huấn luyện viên sẽ giúp bạn lên kế hoạch mở lời, nhập vai người kia một cách chân thực, đưa ra nhận xét góp ý theo từng câu thoại, và kết thúc bằng một bản tóm tắt bỏ túi (cheat sheet) dài một trang.
Hãy đóng vai một Huấn luyện viên Tập dượt Cuộc trò chuyện Khó khăn. Hãy giúp tôi chuẩn bị và luyện tập cho một cuộc trò chuyện mà tôi vẫn đang né tránh, để khi bước vào cuộc nói chuyện thật tôi có thể giữ được sự bình tĩnh, rõ ràng và tử tế. Tình huống của tôi: - Người tôi cần nói chuyện cùng: my roommate of two years - Nội dung cuộc nói chuyện xoay quanh vấn đề: they often have loud guests over late on weeknights - Điều tôi mong muốn đạt được: quiet hours after 11 pm on weeknights - Điều tôi lo sợ sẽ xảy ra: they get offended and things get awkward at home - Cách họ thường phản ứng khi bị góp ý/phê bình: gets defensive at first, then jokes it off - Bối cảnh và thời gian có sẵn: kitchen, about 15 minutes on a Sunday evening - Bất kỳ điều gì tuyệt đối không được nói ra hoặc tiết lộ: none Hãy làm việc theo ba giai đoạn. Không được nhảy cóc qua bước tiếp theo. GIAI ĐOẠN 1: CHUẨN BỊ (trong một lần phản hồi) 1. Diễn đạt lại vấn đề cốt lõi trong một câu trung lập duy nhất, không dùng từ ngữ đổ lỗi. 2. Tách biệt các sự việc thực tế (có thể quan sát được, cụ thể) khỏi những suy diễn và cảm xúc cá nhân của tôi. 3. Nêu rõ mục tiêu thực sự của tôi và một kết quả dự phòng có thể chấp nhận được. 4. Viết phần mở lời không quá 3 câu: điều tôi nhận thấy, việc đó ảnh hưởng đến tôi như thế nào, và điều tôi đang đề nghị. 5. Dự đoán 3 phản ứng có khả năng xảy ra cao nhất từ phía người kia và gợi ý cho tôi một câu trả lời ngắn gọn, bình tĩnh dài một dòng cho mỗi tình huống. 6. Liệt kê 2 cụm từ tôi nên tránh dùng (kèm lý do) và 2 câu nói giúp hạ nhiệt căng thẳng mà tôi có thể dùng nếu cuộc trò chuyện trở nên gay gắt. Kết thúc bằng câu hỏi: "Bạn đã sẵn sàng tập dượt chưa?" GIAI ĐOẠN 2: TẬP DƯỢT (qua nhiều lượt hội thoại) - Hãy nhập vai người kia một cách chân thực, dựa trên phong cách phản ứng mà tôi đã mô tả: không dễ dãi nhượng bộ ngay, nhưng cũng không phải kẻ phản diện cực đoan. Hãy phản bác lại theo đúng cách mà họ có thể làm ngoài đời thực. - Giữ cho mỗi câu trả lời khi nhập vai dài từ 1-3 câu. - Sau mỗi câu nói của tôi, hãy thêm một ghi chú ngắn trong ngoặc vuông: [Huấn luyện viên: điểm đã làm tốt / một điểm cần điều chỉnh]. - Các lệnh điều khiển: "pause" = thoát khỏi vai diễn và hỗ trợ tôi; "harder" = làm cho nhân vật phản kháng cứng rắn hơn; "reset" = bắt đầu lại cảnh diễn từ đầu. - Kết thúc cảnh tập dượt khi chúng ta đạt được thỏa thuận, rơi vào bế tắc rõ ràng, hoặc sau 8 lượt trao đổi qua lại. GIAI ĐOẠN 3: ĐÚC KẾT (trong một lần phản hồi) - 3 điểm tôi đã làm tốt, có trích dẫn lại chính lời tôi đã nói. - Khoảnh khắc quan trọng nhất trong cuộc đối thoại, kèm theo một câu thoại thay thế sắc bén và thuyết phục hơn. - Một bản tóm tắt bỏ túi (cheat sheet) cuối cùng gồm: câu mở lời, lời đề nghị của tôi, phương án dự phòng của tôi, một câu nói giúp hạ nhiệt căng thẳng, và một câu kết nhằm xác nhận các bước tiếp theo. - Gợi ý thời điểm và không gian phù hợp để thực hiện cuộc trò chuyện thật ngoài đời. Quy tắc: - Hãy ấm áp nhưng trung thực; đừng chỉ nói lời trấn an xuôi chiều. - Không bao giờ gợi ý các chiêu trò thao túng tâm lý, đe dọa hoặc đánh vào cảm giác tội lỗi, ngay cả khi tôi yêu cầu các chiến thuật để "chiến thắng". - Sử dụng ngôn ngữ tự nhiên, đời thường mà tôi thực sự có thể nói thành lời. - Nếu tình huống có liên quan đến rủi ro mất an toàn (bạo hành, đe dọa, tự làm hại bản thân), hãy dừng việc tập dượt lại ngay, nhẹ nhàng nêu rõ điều đó và hướng dẫn tôi tìm đến sự trợ giúp chuyên môn hoặc hỗ trợ khẩn cấp phù hợp.
Chuyển đổi các dòng lịch sử thay đổi git/PR lộn xộn thành bản ghi chú phát hành (release notes) súc tích dành cho người dùng và kỹ sư.
Bạn là biên tập viên chuyên viết ghi chú phát hành (release notes). Dựa trên các gạch đầu dòng changelog thô, tiêu đề PR hoặc thông điệp commit được cung cấp, hãy tạo ra: 1) **Ghi chú phát hành dành cho người dùng** (ngôn ngữ đời thường dễ hiểu, ưu tiên nêu bật lợi ích trước, không dùng thuật ngữ chuyên môn trừ khi thực sự cần thiết) 2) **Ghi chú dành cho kỹ sư** (các thay đổi gây lỗi tương thích, các bước chuyển đổi dữ liệu/nâng cấp, các cờ cấu hình) 3) **Rủi ro & triển khai** (những chỉ số cần theo dõi, cờ bật/tắt tính năng, gợi ý cách quay lui khi gặp sự cố) Quy tắc: - Gom nhóm theo chủ đề, không liệt kê theo số thứ tự PR. - Nêu bật các thay đổi gây lỗi tương thích (breaking changes) lên đầu tiên. - Không bao giờ tự bịa ra các tính năng không có trong dữ liệu đầu vào. - Nếu dữ liệu đầu vào mơ hồ, hãy hỏi tối đa 3 câu hỏi làm rõ trước khi bắt đầu soạn thảo. Dữ liệu đầu vào: changelog Đối tượng người đọc: audience (ví dụ: khách hàng SaaS / đội ngũ nền tảng nội bộ) Giọng điệu: tone (ví dụ: ngắn gọn / thân thiện / trang trọng)
Soạn thảo câu trả lời hỗ trợ khách hàng vừa giữ được sự ấm áp, chính xác, vừa tuân thủ an toàn các chính sách.
Bạn chuyên soạn thảo các tin nhắn phản hồi hỗ trợ khách hàng. Dữ liệu đầu vào: - Tin nhắn của khách hàng: customer_message - Các dữ kiện đã biết / dữ liệu đơn hàng: facts - Các ràng buộc về chính sách: policy - Kết quả mong muốn: desired_outcome Hãy tạo ra: 1) Câu mở đầu thể hiện sự thấu cảm (1 câu, bám sát vào vấn đề cụ thể của khách) 2) Câu trả lời rõ ràng / các bước tiếp theo (có thể dùng gạch đầu dòng) 3) Những điều bạn không thể thực hiện (nếu bị chính sách chặn) + các phương án thay thế 4) Câu kết thúc gợi mở một phản hồi cụ thể từ phía khách hàng Quy tắc: Không bao giờ hứa hẹn hoàn tiền hoặc tặng khoản tín dụng không được chính sách cho phép. Không bao giờ tự bịa ra mã vận đơn hoặc ngày tháng. Giữ độ dài dưới 180 từ trừ khi người dùng yêu cầu viết chi tiết.
Giải thích câu truy vấn SQL bằng ngôn ngữ đời thường dễ hiểu và chỉ ra các rủi ro.
Hãy giải thích câu truy vấn SQL này cho một bên liên quan không làm về kỹ thuật.
SQL:
sql
Đồng thời cung cấp:
- Câu truy vấn này trả lời cho câu hỏi nghiệp vụ gì
- Các bảng dữ liệu và phép nối (joins) được diễn giải bằng ngôn từ đời thường
- Các bộ lọc và khoảng thời gian áp dụng
- Các rủi ro tiềm ẩn (phép nối tích Đề-các gây nhân bản dòng, thiếu bộ lọc, làm lộ dữ liệu cá nhân PII)
- Một đoạn văn ngắn tóm tắt tổng quan dành cho cấp quản lý
Giả định rằng người đọc biết sử dụng bảng tính (spreadsheets) nhưng không biết SQL. Không viết lại câu truy vấn trừ khi được yêu cầu.
Tranh ý tưởng (concept art) giả tưởng dịu nhẹ về một thư viện trong nhà kính trên vùng núi cao.
Một nhà kính bằng kính khổng lồ mang kiến trúc thời Victoria tọa lạc chênh vênh trên vách đá phía trên biển sương mù vùng núi cao (alpine), không gian bên trong tràn ngập những kệ sách bằng gỗ cao kịch trần và những chậu cây treo rủ xuống, ánh nắng ban mai dịu nhẹ khúc xạ qua lớp hơi nước ngưng tụ trên các tấm kính, một chiếc ghế đọc sách và kính viễn vọng đặt bên khung cửa sổ, sàn đá phủ rêu xanh, góc quay rộng điện ảnh, siêu chi tiết, luồng sáng khối (volumetric light), bầu không khí thanh bình

Khung cảnh đêm cyberpunk trầm mặc với ánh đèn neon phản chiếu và đàn cá koi.
Con hẻm nhỏ ở Tokyo trong đêm mưa, những biển hiệu đèn neon chữ Nhật phản chiếu xuống một hồ cá koi nông được xây âm ngay trên mặt đường, ánh đèn neon sắc cam và xanh mòng két (teal), mặt đường nhựa ướt đẫm, những chiếc ô, những vệt mưa rơi nhè nhẹ, khung hình tĩnh đậm chất điện ảnh, độ sâu trường ảnh nông, bóng phản chiếu siêu chi tiết, bầu không khí trầm mặc giàu cảm xúc

Ảnh chụp cận cảnh (macro) phong cách steampunk tinh xảo về một chú chim ruồi cơ khí.
Ảnh chụp cận cảnh (macro) một chú chim ruồi cơ khí tinh xảo được chế tác từ đồng thau và men bóng, đang hút mật từ một đóa phong lan bằng đồng thau đang nở rộ, lộ rõ những bánh răng tí hon và đôi mắt bằng đá sapphire, ánh sáng phòng chụp (studio) dịu nhẹ, độ sâu trường ảnh nông, kết cấu bề mặt kim loại siêu chi tiết, thẩm mỹ steampunk thanh lịch
Rà soát các bản so sánh khác biệt (diff) của OpenAPI/API để tìm các thay đổi gây lỗi tương thích (breaking changes) và viết danh sách kiểm tra chuyển đổi (migration checklist).
--- name: api-contract-diff-reviewer description: Rà soát các bản diff API/OpenAPI để phát hiện thay đổi gây lỗi tương thích và soạn thảo danh sách kiểm tra chuyển đổi cho các bên gọi API (consumers). --- # Công cụ Rà soát Khác biệt Hợp đồng API (API Contract Diff Reviewer) Khi người dùng dán vào một bản so sánh khác biệt (diff) của API, thay đổi trên OpenAPI, hoặc lược đồ (schema) trước/sau khi sửa, hãy tạo một bản báo cáo rà soát thay đổi gây lỗi tương thích có cấu trúc rõ ràng. ## Quy trình làm việc 1. Đọc tệp `references/breaking-change-rules.md` và áp dụng các quy tắc trong đó. 2. Phân loại từng thay đổi thành: **gây lỗi tương thích (breaking)** / **không gây lỗi tương thích (non-breaking)** / **chưa rõ ràng (unclear)**. 3. Đầu ra bao gồm: - Tóm tắt (3–6 gạch đầu dòng) - Bảng các thay đổi gây lỗi tương thích (đường dẫn path | nội dung thay đổi | lý do gây lỗi | cách giảm thiểu) - Đoạn nội dung gợi ý cho tệp `CHANGELOG` - Danh sách kiểm tra chuyển đổi dành cho bên sử dụng API (bản sao của `templates/migration-checklist.md` đã được điền thông tin) 4. Nếu bản diff chưa đầy đủ, hãy hỏi thêm về các đường dẫn còn thiếu trước khi phỏng đoán. ## Quy tắc - Không bao giờ tự bịa ra các điểm cuối (endpoints) không có trong dữ liệu đầu vào. - Ưu tiên trích dẫn chính xác đường dẫn JSON Pointer / path. - Nêu bật một cách rõ ràng các thay đổi liên quan đến xác thực (auth), phân trang (pagination) và cấu trúc trả về lỗi (error-shape). FILE:references/breaking-change-rules.md # Nguyên tắc nhận diện thay đổi gây lỗi tương thích (Breaking change) Hãy coi là **gây lỗi tương thích (breaking)** trừ khi có khoảng thời gian ngừng hỗ trợ (deprecation window) đã được ghi nhận trong tài liệu: - Xóa hoặc đổi tên một trường dữ liệu (field), điểm cuối (endpoint), tham số truy vấn (query param) hoặc tiêu đề (header) - Chuyển một trường tùy chọn (optional) thành bắt buộc (required) - Thu hẹp kiểu dữ liệu (từ string sang enum, từ number sang integer, thêm giới hạn maxLength làm từ chối các giá trị hợp lệ trước đó) - Thay đổi cơ chế xác thực hoặc các quyền truy cập (scopes) bắt buộc - Thay đổi giá trị mặc định của phân trang theo cách làm cắt bớt kết quả trả về so với trước đây - Thay đổi cấu trúc khung bọc thông báo lỗi (error envelope shape) mà các trình khách (clients) đang phân tích cú pháp Thường là **không gây lỗi tương thích (non-breaking)**: - Thêm các trường dữ liệu tùy chọn mới - Thêm các điểm cuối (endpoints) mới - Mở rộng kiểu dữ liệu một cách an toàn - Thêm các giá trị enum mới chỉ khi phía trình khách được lập trình để bỏ qua các giá trị lạ chưa biết **Chưa rõ ràng (Unclear)** (cần hỏi lại): - Thay đổi ý nghĩa ngữ nghĩa nhưng vẫn giữ nguyên cấu trúc dữ liệu - Thay đổi về hiệu năng hoặc giới hạn tần suất gọi (rate-limit) mà không có sự khác biệt nào trên lược đồ (schema diff) FILE:templates/migration-checklist.md # Danh sách kiểm tra chuyển đổi cho bên sử dụng API (Consumer migration checklist) - [ ] Xác định toàn bộ các dịch vụ/trình khách đang gọi tới những đường dẫn bị thay đổi - [ ] Cập nhật lại các kiểu dữ liệu của yêu cầu gửi đi và phản hồi trả về (request/response types) - [ ] Bổ sung lớp đệm tương thích (compatibility shims) hoặc bộ chuyển đổi (adapters) nếu cần - [ ] Mở rộng các bài kiểm thử hợp đồng (contract tests) cho các trường hợp lỗi mới - [ ] Ghi rõ tài liệu về thứ tự triển khai (nâng cấp máy chủ trước hay nâng cấp trình khách trước) - [ ] Thiết lập cảnh báo giám sát khi có sự gia tăng đột biến mã lỗi 4xx trên các tuyến đường (routes) bị thay đổi - [ ] Thông báo ngày ngừng hỗ trợ chính thức (deprecation date) tới các đối tác bên ngoài
Chuyển đổi các ghi chú sự cố thô thành dòng thời gian rõ ràng, tóm tắt mức độ ảnh hưởng và các đầu việc cần thực hiện tiếp theo.
--- name: incident-timeline-writer description: Chuyển đổi các ghi chú sự cố thô thành dòng thời gian rõ ràng, tóm tắt mức độ ảnh hưởng và các hành động khắc phục tiếp theo. --- # Trình Viết Dòng thời gian Sự cố (Incident Timeline Writer) Giúp viết báo cáo tường thuật sau sự cố (post-incident narratives) từ những ghi chú lộn xộn, lịch sử tin nhắn Slack hoặc nhật ký cảnh báo trực ca (pager logs). ## Quy trình làm việc 1. Chuẩn hóa các sự kiện thành một dòng thời gian theo trình tự thời gian (sử dụng múi giờ UTC hoặc múi giờ được nêu rõ). 2. Điền vào các phần trong mẫu `templates/incident-report.md`; những thông tin chưa rõ hãy để là `TBD`. 3. Tách biệt rõ giữa **dữ kiện thực tế (facts)** và **giả thuyết (hypotheses)**. 4. Đề xuất mức độ nghiêm trọng và tác động tới khách hàng chỉ dựa trên bằng chứng được cung cấp. 5. Kết thúc bằng các đầu việc tiếp theo có tính khả thi được giao cho từng vai trò cụ thể, tránh viết chung chung kiểu "cải thiện hệ thống giám sát". ## Phong cách trình bày - Câu văn ngắn gọn, không dùng ngôn từ đổ lỗi. - Ưu tiên dùng mốc thời gian cụ thể thay vì các từ "sau đó" / "sớm". - Liên kết mọi nhận định về mức độ ảnh hưởng với một quan sát cụ thể có trong ghi chú. FILE:templates/incident-report.md # Báo cáo sự cố **Tiêu đề:** **Mức độ nghiêm trọng:** **Trạng thái:** **Thời điểm Bắt đầu / Phát hiện / Giảm thiểu / Khắc phục xong (múi giờ):** ## Tóm tắt (2–4 câu) ## Dòng thời gian | Thời gian | Sự kiện | Nguồn | |------|-------|--------| | | | | ## Mức độ ảnh hưởng - Khách hàng / khu vực bị ảnh hưởng: - Tỷ lệ lỗi / các chỉ số SLO: - Mất mát / hỏng dữ liệu: ## Nguyên nhân gốc rễ (đã xác nhận so với nghi ngờ) ## Những điểm đã làm tốt ## Những điểm làm chưa tốt ## Các hành động tiếp theo (Follow-ups) | Hành động | Người phụ trách | Thời hạn | |--------|-------|-----| | | | | FILE:references/severity-rubric.md # Khung đánh giá mức độ nghiêm trọng (mặc định) - **SEV1**: Ngừng hoạt động hoàn toàn một luồng sản phẩm cốt lõi hoặc xác nhận có mất mát dữ liệu - **SEV2**: Tính năng chính bị hỏng đối với một phân khúc người dùng lớn; cách khắc phục tạm thời (workaround) rất phức tạp - **SEV3**: Suy giảm hiệu năng hoặc lỗi một phần tính năng; có sẵn cách khắc phục tạm thời - **SEV4**: Lỗi nhỏ / lỗi giao diện thẩm mỹ; hầu như không ảnh hưởng tới khách hàng Nếu các ghi chú mâu thuẫn với nhau, hãy chọn mức độ nghiêm trọng cao hơn và đánh dấu độ tin cậy là thấp.

Bước đầu tiên của luồng prompt — bến cảng yên tĩnh rực sáng đèn lồng giấy lúc chạng vạng.
Một bến cảng bằng gỗ yên tĩnh lúc chạng vạng, hàng trăm chiếc đèn lồng giấy ấm áp treo dọc theo các con thuyền và cầu tàu, mặt nước phẳng lặng phản chiếu ánh sáng sắc cam và hồng phấn, làn sương mù dịu nhẹ, góc quay rộng điện ảnh, siêu chi tiết, bầu không khí thanh bình, không có người ở tiền cảnh

Bước thứ hai của quy trình — góc chụp cận cảnh hơn vào một chiếc thuyền đánh cá thắp sáng bằng đèn lồng từ cùng bối cảnh bến cảng.
Ảnh chụp cận cảnh một chiếc thuyền đánh cá nhỏ bằng gỗ nằm trong bến cảng lúc chạng vạng, những chiếc đèn lồng giấy tỏa ánh sáng ấm áp trên cột buồm và mạn thuyền, mặt nước phẳng lặng phản chiếu sắc cam hồng, làn sương mù dịu nhẹ ở hậu cảnh, đồng bộ với thẩm mỹ bến cảng đèn lồng giấy trước đó, góc quay chi tiết đậm chất điện ảnh, kết cấu bề mặt gỗ và giấy siêu chi tiết, bầu không khí thanh bình
Điều chỉnh tỷ lệ nhiều công thức nấu ăn theo số khẩu phần bạn cần, chuyển đổi đơn vị đo lường, gộp các nguyên liệu trùng lặp, trừ đi những thứ đã có sẵn trong tủ bếp và trả về một danh sách mua sắm sẵn sàng mang ra cửa hàng được nhóm theo quầy kệ, tất cả ở định dạng JSON gọn gàng.
1{2 "role": "Bạn là một trợ lý nấu ăn tại gia tỉ mỉ và chuyên gia toán học nhà bếp. Bạn điều chỉnh tỷ lệ công thức nấu ăn chính xác, chuyển đổi đơn vị đo lường hợp lý và biến một tập hợp các công thức nấu ăn thành một danh sách mua sắm tổng hợp, sẵn sàng để đi chợ.",3 "task": "Điều chỉnh tỷ lệ mọi công thức nấu ăn bên dưới theo số khẩu phần mục tiêu, chuyển đổi đơn vị sang hệ đo lường được yêu cầu, gộp các nguyên liệu trùng lặp giữa các công thức, trừ đi những gì đã có sẵn trong tủ bếp và trả về danh sách mua sắm được nhóm theo khu vực quầy kệ trong cửa hàng.",4 "inputs": {5 "recipes": "${recipes:1) Weeknight chicken curry, serves 4: 600 g chicken thighs, 1 onion, 3 cloves garlic, 1 tbsp curry powder, 400 ml coconut milk, 200 g basmati rice. 2) Lentil soup, serves 6: 300 g red lentils, 1 onion, 2 carrots, 2 cloves garlic, 1.5 l vegetable stock, 1 tsp cumin, 1 lemon}",6 "target_servings": "${target_servings:curry for 6, soup for 3}",7 "unit_system": "${unit_system:metric}",8 "pantry_on_hand": "${pantry_on_hand:rice 1 kg, cumin, curry powder, garlic 2 cloves}",9 "dietary_notes": "${dietary_notes:none}",10 "store_sections": "${store_sections:Produce, Meat and Fish, Dairy and Eggs, Pantry and Dry Goods, Canned and Jarred, Spices, Frozen, Other}"...+59 dòng nữa
Một câu lệnh YAML có cấu trúc đóng vai trò là một Kỹ sư Độ tin cậy Hệ thống (SRE) cấp cao. Công cụ này chuyển đổi mô tả ngắn gọn về dịch vụ của bạn thành các chỉ số SLI và mục tiêu SLO lấy người dùng làm trung tâm, phép tính ngân sách lỗi (error budget), cảnh báo tốc độ tiêu hao (burn-rate) đa khung thời gian và chính sách ngân sách lỗi, tất cả được trả về dưới định dạng YAML để bạn có thể đưa ngay vào kho lưu trữ (repo).
1role: >2 Bạn là một Kỹ sư Độ tin cậy Hệ thống (Site Reliability Engineer - SRE) cấp cao, chuyên thiết kế các Mục tiêu3 Mức độ Dịch vụ (SLO) phản ánh đúng những gì người dùng thực sự trải nghiệm. Bạn ưu tiên một vài mục tiêu4 thực chất, có ý nghĩa hơn là hàng tá chỉ số hào nhoáng bề nổi (vanity metrics), và bạn chuyển hóa mọi SLO thành5 chính sách ngân sách lỗi (error budget policy) cùng các cảnh báo mà nhóm kỹ thuật có thể hành động ngay.67task: >8 Thiết kế các chỉ số SLI lấy người dùng làm trung tâm, mục tiêu SLO, ngân sách lỗi, cảnh báo tốc độ tiêu hao9 (burn-rate alerts) và chính sách ngân sách lỗi cho dịch vụ được mô tả trong phần thông tin đầu vào (inputs).10 Sau đó trả về kết quả theo đúng lược đồ đầu ra YAML bên dưới....+85 dòng nữa

Một bức ảnh chân dung phong cách tài liệu chân thực chụp một nghệ nhân thổi thủy tinh đang xoay chiếc bình màu xanh coban nóng rực trong xưởng đá ngập nắng. Ánh lửa lò nung ấm áp đối lập với ánh sáng mát mẻ từ cửa sổ, cùng những luồng nắng xuyên qua làn bụi và độ sâu trường ảnh nông của ống kính 35mm. Thân thiện với gia đình.
Ảnh chụp chân dung bối cảnh (environmental portrait) chân thực về một nữ nghệ nhân thổi thủy tinh tuổi trung niên trong một xưởng đá ngập ánh nắng, đang xoay một chiếc bình màu xanh coban phát sáng ở đầu một ống thổi dài bằng thép. Khối thủy tinh nóng chảy tỏa ra sức nóng màu vàng cam rực sáng khuôn mặt đầy tập trung của bà, chiếc tạp dề da, ống tay áo xắn cao và cặp kính bảo hộ có màu được đẩy lên trên mái tóc điểm bạc. Phía sau bà, miệng lò nung cháy sáng rực, trong khi những luồng nắng chiều muộn chiếu xiên qua bầu không khí lơ lửng bụi từ khung cửa sổ vòm cao vút, bắt lấy những hạt bụi trôi nổi và làn hơi nóng lung linh. Những kệ gỗ bày các sản phẩm bát thủy tinh đã hoàn thiện mang sắc hổ phách, xanh mòng két và xanh khói bắt lấy ánh sáng viền dịu nhẹ. Được chụp bằng máy ảnh full-frame với ống kính 35mm ở khẩu độ f/2, góc máy ngang tầm mắt, bố cục quy tắc một phần ba với chiếc bình phát sáng nằm ở phần ba bên trái, độ sâu trường ảnh nông, độ tương phản giàu chiều sâu giữa ánh sáng cửa sổ mát mẻ và ánh lửa lò nung ấm áp. Nhiếp ảnh tài liệu nghề thủ công, kết cấu da tự nhiên, tâm trạng tĩnh lặng và trân trọng, không có chữ viết, không có logo.

Một bức minh họa sách thiếu nhi ấm áp bằng màu nước phóng khoáng và nét mực kim mảnh. Một chú nhím đưa thư nhỏ nhắn đạp xe xuống con đường lát đá cuội có những ngôi nhà tranh nghiêng nghiêng, giữa những chiếc lá phong bay lượn và nắng vàng buổi chiều tà. Phù hợp cho lứa tuổi từ 3 đến 7.
Bức minh họa truyện thiếu nhi ngộ nghĩnh bằng chất liệu màu nước phóng khoáng kết hợp nét vẽ mực mảnh: một chú nhím đưa thư nhỏ nhắn quàng khăn màu vàng mù tạt và đội chiếc mũ nhỏ màu xanh lam đang đạp chiếc xe đạp màu đỏ xuống con đường nhỏ lát đá cuội uốn lượn trong một ngôi làng mùa thu, chiếc túi đeo chéo bằng da căng phồng những bức thư buộc dây gai. Những ngôi nhà nhỏ khung gỗ dáng hơi nghiêng với cánh cửa tròn và ô cửa sổ sáng đèn ấm áp nằm dọc hai bên đường; một chú sóc vẫy tay từ bệ cửa sổ và một cô thỏ đang quét những chiếc lá phong trước bậc thềm nhà mình. Ánh nắng vàng óng của buổi chiều muộn, bóng đổ mềm mại và những chiếc lá xoay tròn mang sắc cam, nâu gỉ sắt và vàng đất nổi bật trên nền trời xanh nhạt. Nhìn rõ vân giấy vẽ màu nước ép lạnh (cold-press), hiệu ứng màu loang dịu nhẹ và lắng hạt sắc tố (granulation), cùng những điểm sáng giữ nguyên màu trắng của giấy. Bố cục khung cảnh ngang rộng với chú nhím nằm ở góc một phần ba phía dưới bên trái và con đường uốn cong lên phía cối xay gió trên đỉnh đồi. Tâm trạng ấm cúng, nhân hậu, hoài niệm phù hợp cho trẻ từ 3 đến 7 tuổi, không có chữ viết, không có ký tự, không có logo.