---
url: https://docs.nemo12.com/reference/data-dictionary/run-log-versioning.md
description: >-
  Từ điển dữ liệu D1, domain Run log & versioning: 4 bảng, engine_runs tới
  workflow_runs; cột, kiểu, khoá ngoại, index.
---

# Data Dictionary · Run log & versioning

> ⚙️ **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, `engine_runs` tới `workflow_runs`.

## `engine_runs`

\--------------------------------------------------------------------------- 4. Engine run history — bằng chứng "engine đã chạy thật", mỗi lần chạy một dòng. ---------------------------------------------------------------------------

migration: `0027_goal_model_run_history.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `engine` | TEXT | NOT NULL |
| `engine_version` | TEXT | NOT NULL |
| `learner_id` | TEXT | — |
| `workflow_run_id` | TEXT | REFERENCES workflow_runs(id) |
| `trigger` | TEXT | NOT NULL |
| `status` | TEXT | NOT NULL DEFAULT 'running' CHECK (status IN ('running','succeeded','failed')) |
| `started_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `finished_at` | TEXT | — |
| `duration_ms` | INTEGER | — |
| `input_json` | TEXT | — |
| `output_json` | TEXT | — |
| `produced_model_kind` | TEXT | — |
| `produced_version` | INTEGER | — |
| `produced_change` | INTEGER | NOT NULL DEFAULT 0 |
| `error` | TEXT | — |
| `input_ref` | TEXT |  — thêm ở 0034_run_evidence.sql |
| `output_ref` | TEXT |  — thêm ở 0034_run_evidence.sql |
| `model_version` | TEXT |  — thêm ở 0034_run_evidence.sql |
| `confidence` | REAL |  — thêm ở 0034_run_evidence.sql |

**Khóa ngoại:** `workflow_run_id` → `workflow_runs`

**Index:** `idx_engine_runs_learner`(learner_id, started_at DESC) · `idx_engine_runs_engine`(engine, started_at DESC) · `idx_engine_runs_workflow`(workflow_run_id) · `idx_engine_runs_status`(status, started_at DESC)

## `learner_goal_entries`

\--------------------------------------------------------------------------- 1. Goal Model — goal tree first-class (SDD-002 §16). Được phép rỗng (RISK-009).    Ngày thi = deadline trên goal entry — nguồn duy nhất. ---------------------------------------------------------------------------

migration: `0027_goal_model_run_history.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `learner_id` | TEXT | NOT NULL REFERENCES learners(id) |
| `parent_goal_id` | TEXT | REFERENCES learner_goal_entries(id) |
| `title` | TEXT | NOT NULL |
| `kind` | TEXT | NOT NULL CHECK (kind IN ( |
| `blueprint_id` | TEXT | — |
| `subject_id` | TEXT | — |
| `priority` | INTEGER | NOT NULL DEFAULT 1 |
| `horizon` | TEXT | NOT NULL DEFAULT 'strategic' CHECK (horizon IN ('operational','tactical','strategic','undated')) |
| `urgency` | REAL | NOT NULL DEFAULT 0 |
| `deadline` | TEXT | — |
| `dependencies_json` | TEXT | — |
| `conflict_flags_json` | TEXT | — |
| `source` | TEXT | NOT NULL CHECK (source IN ('parent','learner_self','declaration','enrollment','system')) |
| `origin_kind` | TEXT | — |
| `origin_id` | TEXT | — |
| `status` | TEXT | NOT NULL DEFAULT 'active' CHECK (status IN ('active','achieved','dropped')) |
| `model_version` | INTEGER | NOT NULL DEFAULT 1 |
| `created_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `updated_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |

**Khóa ngoại:** `learner_id` → `learners` · `parent_goal_id` → `learner_goal_entries`

**Index:** `idx_goal_entries_learner`(learner_id, status) · `idx_goal_entries_origin`(learner_id, origin_kind, origin_id) UNIQUE

## `workflow_run_steps`

migration: `0027_goal_model_run_history.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `run_id` | TEXT | NOT NULL REFERENCES workflow_runs(id) |
| `seq` | INTEGER | NOT NULL |
| `step_code` | TEXT | NOT NULL |
| `status` | TEXT | NOT NULL CHECK (status IN ('succeeded','failed','skipped')) |
| `started_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `duration_ms` | INTEGER | — |
| `detail_json` | TEXT | — |
| `error` | TEXT | — |

**Khóa ngoại:** `run_id` → `workflow_runs`

**Index:** `idx_workflow_steps_run`(run_id, seq)

## `workflow_runs`

\--------------------------------------------------------------------------- 3. Workflow run history — bằng chứng "workflow đã chạy thật" (WF-01, WF-03, WF-04…). ---------------------------------------------------------------------------

migration: `0027_goal_model_run_history.sql`

| Cột | Kiểu | Ràng buộc / ghi chú |
| --- | --- | --- |
| `id` | TEXT | PRIMARY KEY |
| `workflow_code` | TEXT | NOT NULL |
| `workflow_name` | TEXT | NOT NULL |
| `learner_id` | TEXT | — |
| `actor_user_id` | TEXT | — |
| `trigger` | TEXT | NOT NULL |
| `status` | TEXT | NOT NULL DEFAULT 'running' CHECK (status IN ('running','succeeded','failed')) |
| `started_at` | TEXT | NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) |
| `finished_at` | TEXT | — |
| `duration_ms` | INTEGER | — |
| `input_json` | TEXT | — |
| `output_json` | TEXT | — |
| `error` | TEXT | — |
| `input_ref` | TEXT |  — thêm ở 0034_run_evidence.sql |
| `output_ref` | TEXT |  — thêm ở 0034_run_evidence.sql |
| `request_id` | TEXT |  — thêm ở 0034_run_evidence.sql |

**Index:** `idx_workflow_runs_learner`(learner_id, started_at DESC) · `idx_workflow_runs_code`(workflow_code, started_at DESC) · `idx_workflow_runs_status`(status, started_at DESC)
