---
url: https://docs.nemo12.com/reference/data-dictionary/content-coral.md
description: >-
  Từ điển dữ liệu D1, domain Nội dung (Coral): 4 bảng, content_blueprints tới
  item_versions; cột, kiểu, khoá ngoại, index.
---

# Data Dictionary · Nội dung (Coral)

> ⚙️ **Trang này sinh tự động** từ source code bằng `scripts/gen-reference.mjs` — đừng sửa tay, sửa code rồi chạy `npm run gen:reference`.

Thuộc [Data Dictionary](../data-dictionary.md). 4 bảng, `content_blueprints` tới `item_versions`.

## `content_blueprints`

Migration 0016 — Content blueprint registry (LX / Assessment). SDD-013 §3, REQ-CNT-05/09/11. Tên `content_blueprints` (không phải `blueprints` như bản đầu SDD-013 §3) vì `blueprints` đã là bảng goal blueprint (SDD-002 §12, migration 0002) — hai nghĩa khác nhau, SDD-013 §1.5. DDL thuần, không data (RISK-014): row vào bằng scripts/seed-blueprints.mjs hoặc API.

migration: `0016_content_blueprints.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `kind` | TEXT | NOT NULL CHECK (kind IN ('lx','assessment')) |
| `name_vi` | TEXT | NOT NULL |
| `description` | TEXT | — |
| `target_selector_json` | TEXT | NOT NULL |
| `spec_json` | TEXT | NOT NULL |
| `version` | INTEGER | NOT NULL DEFAULT 1 |
| `status` | TEXT | NOT NULL DEFAULT 'draft' CHECK (status IN ('draft','active','deprecated')) |
| `created_by` | TEXT | — |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |

**Index:** `idx_content_blueprints`(kind, status)

## `content_review_queue`

\--------------------------------------------------------------------------- 3. content_review_queue — learner báo sai thì đi về đâu (AS-06.2.5, AS-10.4.5) --------------------------------------------------------------------------- Hai nguồn đổ vào: báo cáo của người (bảng content_reports) và sàng lọc máy (screen_flags_json). Có hàng đợi thì báo cáo không rơi vào hư vô — Coral xử lý, ghi lại đã kết luận ra sao.

migration: `0032_content_lifecycle.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `target_type` | TEXT | NOT NULL,        -- item | exam | interaction | forum_topic | experience |
| `target_id` | TEXT | NOT NULL |
| `reason` | TEXT | NOT NULL,             -- vì sao vào hàng đợi (mã lỗi máy hoặc lời learner) |
| `reported_by` | TEXT | ,                 -- user id; NULL = do máy sàng lọc |
| `status` | TEXT | NOT NULL DEFAULT 'open' |
| — | *table constraint* | `CHECK (status IN ('open','in_review','resolved','dismissed'))` |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `resolved_at` | TEXT | — |
| `resolution` | TEXT | -- kết luận: sửa gì, hoặc vì sao không sửa |

**Index:** `idx_review_queue_status`(status, created_at DESC) · `idx_review_queue_target`(target_type, target_id)

## `generation_runs`

migration: `0016_content_blueprints.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `blueprint_id` | TEXT | NOT NULL REFERENCES content_blueprints(id) |
| `blueprint_version` | INTEGER | NOT NULL |
| `input_json` | TEXT | — |
| `status` | TEXT | NOT NULL DEFAULT 'queued' CHECK (status IN ('queued','running','review','done','failed')) |
| `progress_done` | INTEGER | NOT NULL DEFAULT 0 |
| `progress_total` | INTEGER | NOT NULL DEFAULT 0 |
| `stats_json` | TEXT | — |
| `started_at` | TEXT | — |
| `finished_at` | TEXT | — |

**Khóa ngoại:** `blueprint_id` → `content_blueprints`

**Index:** `idx_generation_runs`(blueprint_id, status)

## `item_versions`

\--------------------------------------------------------------------------- 2. item_versions — nội dung production không sửa trực tiếp (AS-06.3.1 🔴, AS-06.3.5) --------------------------------------------------------------------------- Mọi thay đổi tạo một version mới ở trạng thái candidate; publish là hành động đổi con trỏ. Rollback = publish lại một version cũ, không sửa tay DB.

migration: `0032_content_lifecycle.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `item_id` | TEXT | NOT NULL |
| `version` | INTEGER | NOT NULL |
| `payload_json` | TEXT | NOT NULL,       -- snapshot đầy đủ: prompt, options, correct_index, misconception… |
| `quality_json` | TEXT | ,                -- hồ sơ chất lượng 8 chiều tại đúng version này |
| `status` | TEXT | NOT NULL DEFAULT 'candidate' |
| — | *table constraint* | `CHECK (status IN ('candidate','published','rejected','superseded'))` |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `created_by` | TEXT | — |
| — | *table constraint* | `UNIQUE (item_id, version)` |

**Index:** `idx_item_versions_item`(item_id, version DESC) · `idx_item_versions_status`(status, created_at DESC)
