---
url: https://docs.nemo12.com/reference/family-model.md
description: >-
  Bản nháp Family Model, Relationship Model và Commitment Model (SRC-587): ba
  model cập nhật liên tục thông tin gia đình.
---

# Family Model · Relationship Model · Commitment Model

Chỉ đạo SRC-587: *"cần có một số Model (kiểu như Family Model) để liên tục nâng cấp và update thông tin về family và những gì liên quan"*.

Trang này định nghĩa ba model đó theo đúng khuôn đã dùng cho [Learner Model](../architecture/sdd-002-learner-intelligence/index.md): **trạng thái + nguồn + độ tin cậy + thời điểm**, cập nhật liên tục chứ không phải một biểu mẫu ai đó điền một lần.

## 1. Vì sao là Model chứ không phải cột trong bảng

`family_contacts` ([SDD-023](../architecture/sdd-023-family-workspace/index.md) §3) đã giữ được *"số điện thoại của mẹ là gì"*. Nhưng nó không giữ được:

* *"Nhà này đang lo nhất chuyện gì?"* — câu trả lời đổi theo tháng.
* *"Ta biết điều đó từ đâu?"* — mẹ tự nói, hay mentor suy ra từ ba lần hỏi cùng một câu?
* *"Điều đó còn đúng không?"* — một nỗi lo ghi từ tháng Tư có thể đã hết từ lâu.

Ba câu này đều là câu về **niềm tin có thời hạn**, không phải câu về dữ liệu. Đó là định nghĩa của một Model ở Nemo12.

## 2. Ba tầng sự thật

Mọi mẩu thông tin trong Family Model mang một trong ba nhãn, và **nhãn không bao giờ bị mất khi hiển thị**:

| Tag tầng | Nghĩa | Ví dụ |
| --- | --- | --- |
| `opinion` | gia đình **tự nói** | "Tôi muốn cháu thi Ams" |
| `fact` | Dolphin **quan sát thấy** | mẹ hỏi về học phí ba lần trong hai tuần |
| `hypothesis` | **suy ra**, chưa chắc | 6 tuần không mở tin nhắn nào |

Vì sao phải tách: một câu suy luận trình bày như lời gia đình nói là **bịa lời người khác**. Nếu Dolphin gọi điện và mở đầu bằng *"em nghe nói anh chị đang lo về học phí"* trong khi thật ra đó là máy đoán, thì cuộc gọi đó hỏng ngay câu đầu.

Đây cũng chính là nguyên tắc đã áp khi bố mẹ và con khai khác nhau ([WF-19](../workflows/two-door-onboarding.md) §6): giữ cả hai kèm tác giả, không chọn hộ.

## 3. Family Model — dựng từ note đã gắn tag

Từ 2026-08-26, Family Model **không có bảng riêng và không có cột riêng**. Nó là một **view dẫn xuất** gom `family_notes` theo tag ([SDD-024](../architecture/sdd-024-dory.md) §2, [family-notes-review](../product/family-notes-review/decisions.md) §10c).

```text
FamilyModel(family_id) = gom family_notes đang active của nhà đó, nhóm theo tag:

  goals        ← note gắn `goal`
  concerns     ← note gắn `concern`   (bao gồm cả pains — chủ dự án chốt gộp)
  insights     ← note gắn `insight/dynamics` · `insight/environment` · `insight/motivation`
  jtbd         ← note gắn `jtbd`
  hypotheses   ← note gắn `hypothesis`; kết luận là một reply vào chính nó
  untagged     ← note CHƯA có tag mục: chính là hộp vào

  mỗi mẩu mang sẵn: tầng (`fact`/`opinion`/`hypothesis`) · tác giả · ngày · buổi gặp sinh ra nó
```

Ba tính chất đi thẳng từ cách dựng này:

* **Không sửa tay được.** Không có `UPDATE` nào lên hồ sơ sống. Muốn đổi thì thêm một note.
* **Mọi câu truy ngược được** về `note_id` và `visit_id`.
* **Thông tin cũ tự mờ đi** theo `created_at` của note gần nhất cùng chủ đề, không cần cột `last_seen_at` — vì tầng note đã giữ sẵn thời điểm.

### Vì sao bỏ `confidence` dạng số

Bản trước gán 0.9 / 0.7 / 0.4 cho ba tầng. Con số đó **không đến từ phép đo nào** — nó chỉ là ba tầng viết lại bằng số, và một số thập phân gợi ý một độ chính xác không có thật. Nay giữ đúng ba tầng, đọc thẳng ra chữ.

## 4. Relationship Model

Family Model nói *"ta biết gì"*. Relationship Model nói *"quan hệ đang thế nào"*.

```text
RelationshipModel(family_id) = {
  health:            ấm | bình thường | đang nguội | im lặng
  direction:         tốt lên | đi ngang | xấu đi
  primary_contact:   ai là người thực sự nói chuyện với ta
  responsiveness:    thời gian phản hồi trung bình
  open_loops:        số tương tác ta chưa trả lời
  last_meaningful:   lần trao đổi có nội dung gần nhất
}
```

`health` **không phải điểm số** — nó là bốn mức có tên, và mỗi mức luôn đi kèm câu giải thích vì sao. Một con số 63/100 gợi ý một độ chính xác không có thật, và nó dẫn thẳng tới việc xếp hạng gia đình mà [PRD-003 §8](../product/prd-003-dory-anchor.md) đã từ chối.

`primary_contact` đáng có mặt vì nó hay lệch với `role`: hồ sơ ghi bố là người liên hệ chính, còn thực tế mọi tin nhắn đều là mẹ trả lời.

## 5. Commitment Model

```text
CommitmentModel(family_id) = {
  open:        [{ commitment_id, tóm_tắt, owner, due_at, rủi_ro }]
  overdue:     [...]
  at_risk:     [...]     -- sắp tới hạn mà chưa có action nào nhúc nhích
  closed_without_evidence: [...]   -- đã đóng nhưng thiếu bằng chứng
  load_by_owner: { user_id: số_việc_đang_mở }
}
```

`closed_without_evidence` cố ý là một mục nổi bật chứ không phải một bộ lọc ẩn: đó là **chỗ hệ thống tự thú nhận nó đang bị dùng sai**. Không bày ra thì luật "phải có bằng chứng mới đóng" chỉ là một dòng trong tài liệu.

## 6. Cái model này KHÔNG làm

| Không | Vì sao |
| --- | --- |
| Sinh một điểm tổng cho gia đình | Một số tổng che mất thứ nó tổng hợp; xem [Q-137](../open-questions/index.md) |
| Tự gửi tin cho phụ huynh dựa trên tín hiệu | Model nói cho Dolphin biết, Dolphin quyết định nói gì với gia đình |
| Suy luận về hoàn cảnh kinh tế, sức khoẻ, hôn nhân | Ngoài phạm vi, và là loại suy luận sai thì gây hại thật |
| Dùng dữ liệu học tập của trẻ để chấm phụ huynh | Trộn hai chủ thể; kết quả học của con không phải thước đo về bố mẹ |

## Trace

REQ-DOR-04 → §3 · REQ-DOR-06 → §3-4 · [PRD-003](../product/prd-003-dory-anchor.md) §3 · [SDD-024](../architecture/sdd-024-dory.md) · [SDD-025](../architecture/sdd-025-anchor.md).
