---
url: https://docs.nemo12.com/architecture/sdd-038/goal-profile.md
description: >-
  Trang Goal, hồ sơ IELTS Learner, Learner Profile tám câu, ngày sinh trường
  lớp, điểm mặc định 5.0
---

# SDD-038 · Mục tiêu và Learner Profile

> Một phần của [SDD-038 Cổng IELTS](index.md). Phần đầu là đặc tả đang áp dụng, mỗi mục giữ số § cũ; diễn biến và lý do các vòng quyết định nằm ở mục **Lịch sử quyết định** cuối trang.

## 37. Hồ sơ riêng của IELTS Learner, và hai chỗ gập lại (SRC-910, 2026-09-20)

### 37a. `/ielts/profile` — hồ sơ của người luyện IELTS, không phải hồ sơ học sinh

Menu tài khoản ở cả hai mạch IELTS đang trỏ sang `/profile` của learn. Trang ấy phục vụ một learner
phổ thông: trường, lớp, tỉnh thành, ba nguyện vọng trường chuyên. Không dòng nào trong đó trả lời
câu hỏi mà một người đang luyện IELTS đặt ra về chính mình, và learner phải lướt qua cả ba cụm để
tìm ra rằng ở đây không có band mục tiêu của họ.

Trang mới trả lời đúng ba câu, theo thứ tự learner hỏi:

| Thẻ | Trả lời | Nguồn |
| --- | --- | --- |
| Ai | ảnh, tên, email, ngày sinh, trường | `me` + `GET /profile` |
| Đứng đâu | Overall hiện tại kèm nguồn, Overall mục tiêu, ngày thi, khoảng cách, kỹ năng đang nâng | `ielts-setup` + `ielts-goal` |
| Đã khai gì | tám dòng lời khai, **gập, đóng sẵn** | `ielts-profile` |

Trang **chỉ đọc**. Điểm hiện tại và band mục tiêu sửa ở `/ielts/settings`, lời khai sửa ở
`/ielts/setup`, và mỗi thẻ mang một đường dẫn sang đúng chỗ ấy. Dựng bộ form thứ hai cho cùng mấy
giá trị là tạo hai chỗ ghi một thứ, và ngày chúng lệch thì không có cách nào biết bên nào đúng.

Overall mục tiêu đọc từ `ielts-goal` chứ không tự trung bình bốn band trong `ielts-profile.target`:
luật làm tròn về 0,5 nằm ở server, và một bản sao ở client sẽ lệch khỏi đúng con số learner vừa
nhìn thấy ở Settings.

Địa chỉ `/ielts/profile` đứng **trước** nhánh legacy `/ielts/<task>` trong `pathToRoute`. Nhánh ấy
nhận mọi khoá lạ dưới `/ielts/` rồi rơi về mạch luyện, nên một địa chỉ mới đặt sau nó sẽ mở ra một
trang khác mà không báo lỗi gì. Test `ieltsRoutes.test.ts` ghim cả hai chiều.

### 37b. Hộp thoại tài khoản bị cắt mất nửa trên

Nguyên nhân không nằm ở thẻ mà ở tổ tiên của nó: `position: fixed` bám vào khung chứa gần nhất có
`filter` hoặc `backdrop-filter`, **không** phải khung nhìn. Thanh trên của mọi cổng mang
`.n12-nav-deep`, tức là có `backdrop-filter: blur(10px)`, và hộp thoại của `AvatarMenu` nằm bên
trong thanh ấy. `inset-0` của nó vì thế là chiều cao THANH.

Sửa bằng `createPortal` ra thẳng `document.body`: ngoài đó không có tổ tiên nào lọc nền, nên
`fixed` lại đúng nghĩa. Đây là luật chung cho mọi lớp phủ trong dự án, không riêng menu này.

### 37c. Learning Setup gập lại

Hai chỗ gập, và cả hai đều gập thứ để ĐỌC chứ không gập thứ để LÀM:

* **Năm chặng**: chỉ chặng `current` (server chỉ ra) mở sẵn; các chặng khác thu về một dòng đầu
  chặng kèm con số `2/3` thay cho cả danh sách bên trong. Learner vẫn biết chặng nào còn dở mà
  không phải mở ra đếm, và một cú bấm là mở lại — gập không phải là giấu.
* **Ghi chú của Nemo** (`reveal`): đoạn văn dài, nay chỉ hiện dòng đầu làm mồi.

Chặng dùng `useState` chứ không dùng `<details>` như khối ghi chú: Starting Point chứa form có
`EditGate`, và một `<details>` đóng lại sẽ ẩn cả cây con — một cú bấm nhầm vào đầu chặng là mất
trạng thái đang sửa dở, đúng cái hỏng mà SRC-861 vừa gỡ.

## 62. Trang Goal và đầu trang Learning Setup, dọn lần nữa (SRC-954, 22.09.2026)

### 62a. Ở chế độ đọc thì nút cộng trừ BIẾN MẤT, không phải mờ đi

`EditGate` vốn đã khoá chúng bằng `<fieldset disabled>`, nhưng khoá không đủ. Tám cái nút tròn nằm
quanh bốn con số vẫn đọc ra như một lời mời bấm, learner bấm thì không có gì xảy ra, và một màn
hình im lặng không phản hồi là cách chắc nhất để người ta nghĩ nó hỏng.

Phân biệt với luật cũ ở §`BandStepper`: nút TẮT vì chạm trần 4.0/9.0 thì vẫn hiện (giữ hàng nút
khỏi nhảy chỗ). Nút ở chế độ đọc thì ẩn hẳn — ở đó cả thao tác ấy không tồn tại.

### 62b. Save và Cancel đứng đúng chỗ nút Edit

Trước: bấm Edit ở góc trên, rồi phải cuộn xuống dưới một lưới bốn ô để tìm nút Save. Nay
`EditGate` nhận nút Save từ form con qua `useRegisterSave` và vẽ nó cùng Cancel ngay chỗ Edit vừa
đứng.

Vì sao là đăng ký chứ không phải `EditGate` tự vẽ một nút Save: lưu là việc của FORM (mỗi form một
API, một điều kiện hợp lệ, một trạng thái "đang lưu"). Đổi chỗ một cái nút thì rẻ; chuyển luồng
lưu vào component bọc ngoài thì đắt và sẽ hỏng đúng ở chỗ form nào cũng khác nhau một tí. Form nào
KHÔNG đăng ký thì header chỉ có Cancel và nút Lưu của nó vẫn nằm dưới như cũ — đường lùi có chủ ý
cho `CurrentScore` và `DeclarationBlock`, vốn chưa đổi.

### 62c. Ngày thi lên đầu, có nhãn; thẻ còn 40% chiều ngang

Ngày thi đóng khung mọi con số bên dưới: cùng mục tiêu 8.5, thi sau ba tháng và thi sau hai năm là
hai kế hoạch không giống nhau ở chỗ nào cả. Trước đó nó nằm cuối thẻ như một chi tiết phụ, và là
một chuỗi `17/12/2027` trần không có nhãn — learner phải đoán đó là ngày thi, ngày đặt mục tiêu hay
ngày sửa gần nhất.

Thẻ hẹp lại còn `sm:w-2/5`: kéo hết một màn desktop thì giữa nhãn `LISTENING` và con số `8.5` là
một khoảng trống dài nửa gang tay. Dưới 640px vẫn full, vì 40% của một màn hẹp là một cột chữ vỡ.

### 62d. Đầu trang Learning Setup bỏ hai khối, và đổi dòng đếm bước

* Dòng đếm bước thành **"Tell Nemo about you. The more it knows, the better it can help."** Một con
  số đếm việc trả lời "còn mấy việc nữa" nhưng không trả lời câu learner hỏi trước đó: khai mấy thứ
  này để làm gì. Và khi xong hết thì `5 of 5 steps done` không còn nói gì cả. Số việc còn lại vẫn
  đọc được ở chính từng chặng, nơi learner sắp bấm vào.
* **Bỏ thẻ "How well does Nemo know your level?"**: nó nói về chất lượng dữ liệu của Nemo, không
  nói learner phải làm gì; với người mới, dòng đầu tiên họ đọc là lời thú nhận rằng hệ chưa biết gì
  về họ. Mức bằng chứng vẫn được server tính và vẫn quyết định ai phải đo lại.
* **Bỏ khối ghi chú của Nemo** (`reveal`): nó trả lời một câu learner chưa hỏi, ngay trên đường tới
  việc họ vào đây để làm. Chỗ của nhận định là trang Hồ sơ và buổi gặp với thầy cô.

Cả `evidence` lẫn `reveal` VẪN nằm trong payload `/ielts-setup` — `CurrentScore` còn đọc `evidence`,
và gỡ chúng khỏi API là một việc khác, có giá khác.

## 63. Hai cột, dấu tròn đặc, và Study context về đúng chặng (SRC-955, 22.09.2026)

### 63a. Study context thuộc về Starting Point

Nó luôn là câu trả lời cho *"con đang ở đâu"* — mỗi tuần học mấy giờ, kỹ năng nào thấy khó nhất —
chứ không phải cho *"con muốn tới đâu"*. Đứng ở Goal, nó làm chặng ấy hỏi hai câu khác nhau trong
khi chặng bên cạnh chỉ hỏi đúng câu nó thuộc về.

**Khoá `declarations` giữ nguyên**, chỉ đổi chặng chứa nó: khoá ấy còn là `part` của bước "goal" ở
`pathway.ts` và là đích của một `IeltsTaskKey`. Đổi khoá thì phải đổi cả hai chỗ đó cộng mọi link
đã gửi đi, để đổi đúng một chỗ đứng trên màn hình.

**Chỗ suýt hỏng, và e2e bắt được:** nhánh `starting_point` trong `PhaseCard` vốn thay TOÀN BỘ danh
sách `parts` bằng form chọn lối vào. Chuyển Study context sang chặng ấy mà không sửa nhánh này thì
dòng ấy biến mất khỏi màn hình — learner không còn đường nào tới trang khai. Nay nhánh ấy vẽ form
rồi vẽ tiếp những part có trang riêng, qua `PartRow` dùng chung cho cả hai chỗ.

### 63b. Hai cột chia theo nghĩa, không theo số

Cột trái là hai chặng learner tự **khai** (đích và chỗ đứng); cột phải là ba chặng có việc phải
**làm** (đo, gặp thầy cô, kế hoạch). Đó cũng là thứ tự thời gian, đọc từ trái sang phải. Mỗi thẻ vì
thế còn khoảng nửa chiều ngang, đúng khoảng 45-50% chỉ đạo nói tới, và cả năm chặng vào vừa một màn.

Dưới 1024px về **một cột** theo đúng thứ tự 1-2-3-4-5: hai cột trên màn hẹp thì dòng tóm tắt
"Band 8.5 · 17.12.2027" vỡ làm ba dòng.

### 63c. Dấu tròn đặc — đảo lại SRC-909, có chủ ý

SRC-909 (20.09.2026) đổi dấu xong từ đĩa đặc sang nét check mảnh, vì *"các chấm màu da cam hơi quá
to, và quá nhiều"*. Nay chỉ đạo đảo lại, và đây không phải một lần quên luật cũ — **đừng "sửa lại
cho đúng" bằng cách trả về nét check**.

Thứ đã đổi giữa hai lần chỉ đạo: hồi ấy năm chặng nằm trong một cột dài với mọi phần con mở sẵn,
nên hơn chục chấm đặc cùng hét lên một lúc. Nay các chặng gập lại và xếp hai cột, số dấu trên màn
ít hẳn, và một vòng tròn đặc đọc được từ xa hơn mọi nét mảnh.

Dòng chưa xong là vòng tròn RỖNG cùng đường kính, nên hàng chữ thẳng cột dù dòng nào xong trước.

## 64. Trang Goal thành hai thẻ, và ba lối vào cho "lần thi gần nhất" (SRC-956, 22.09.2026)

### 64a. Ba lối vào, và vì sao lối thứ ba tồn tại

| | Hỏi gì | Nguồn lưu |
| --- | --- | --- |
| `taken` | Bốn band, nguồn (thi thật / thi thử), ngày thi | `official` hoặc `mock_test` |
| `guess` | Bốn band, không hỏi ngày | `self_estimate` |
| `no_guess` | Không hỏi gì; bốn ô BIẾN MẤT | xoá dòng `self_estimate` nếu có |

Lối thứ ba không phải để cho đủ bộ. Thiếu nó, learner chưa thi chỉ còn một đường: gõ đại bốn con
số. Bốn con số ấy đi thẳng vào Learner Model và vào kế hoạch học, và một phỏng đoán bịa ra còn tệ
hơn không có gì — Nemo sẽ tự tin về một chỗ đứng không có thật. Thà để trống rồi đo.

`guess` không hỏi ngày vì một phỏng đoán không có ngày thi; bắt điền là bắt bịa ra một sự kiện
chưa xảy ra.

### 64b. "Không đoán" xoá điểm tự đoán cũ, và CHỈ điểm tự đoán

Learner đã đoán 6.5 rồi đổi ý thì con số ấy phải biến mất thật, nếu không màn hình nói một đằng
còn Learner Model dùng một nẻo. Nhưng chỉ xoá dòng `self_estimate`: điểm thi THẬT là một sự kiện
đã xảy ra, không phải một phỏng đoán, và không ai được xoá nó bằng một cú bấm ở màn này. Màn hình
nói trước khi lưu rằng nó sắp xoá.

### 64c. Mỗi thẻ một `EditGate`, không phải một cổng chung

Hai thẻ lưu vào hai API khác nhau, và `useRegisterSave` (§62b) chỉ giữ được MỘT nút Save cho mỗi
cổng — gộp lại thì thẻ đăng ký sau ghi đè nút của thẻ trước, và một trong hai thẻ mất đường lưu mà
không có lỗi nào hiện ra. Cái giá là hai nút Edit trên một màn; đổi lại, sửa mục tiêu không kéo
theo mở khoá cả điểm thi, và bấm Cancel ở thẻ này không vứt thứ đang gõ dở ở thẻ kia.

Mỗi thẻ mang `aria-label` riêng (`Latest test`, `Target`): hai thẻ bày cùng một thứ — một Overall,
bốn ô band, một nút Edit — nên không có cách nào chỉ đúng một thẻ nếu chúng không tự xưng tên.
Trình đọc màn hình cần đúng điều đó, và e2e gác theo cùng cái tên ấy.

## 70. Learner Profile thay hẳn Study context (SRC-963, 22.09.2026)

### 70a. Hai trang trả lời hai câu khác nhau

| | Câu hỏi |
| --- | --- |
| Study context (đã bỏ) | "con học IELTS trong hoàn cảnh nào" |
| **Learner Profile** | "con là người học như thế nào, và Nemo cần biết gì để giúp cho trúng" |

Sáu thẻ: động lực · cách học · hoàn cảnh học · tự tin và lo lắng · lịch sử ôn thi · cản trở và hỗ
trợ. Mười chín câu, `/ielts/learner-profile`.

**Cố ý KHÔNG có ở đây**: điểm hiện tại, điểm mục tiêu, ngày thi, số giờ mỗi tháng, tiến độ từng kỹ
năng. Chúng thuộc `/ielts/settings` và Learning Plan; hỏi lại ở đây là hai chỗ cùng giữ một sự
thật, và hai chỗ ấy sẽ lệch nhau ngay lần đầu learner sửa một bên.

### 70b. Ba tầng, và tầng 3 được đối xử khác

`identity` (hiếm khi đổi) · `context` (vài tháng một lần) · `state` (theo tuần). Nhãn tầng hiện
ngay trên thẻ, vì nó nói cho learner biết vì sao Nemo hỏi lại thẻ này mà không hỏi thẻ kia.

Tầng `state` không nên để learner vào sửa tay thường xuyên: tự tin là thứ họ đã trả lời bằng chính
hành vi, và một ô bắt họ tự chấm điểm mình mỗi tuần sẽ bị bỏ trống sau lần thứ hai. Vòng này vẫn
cho khai; đường đi đúng về sau là Nemo suy ra rồi hỏi lại — cột `source` trong migration 0271 để
sẵn cho đúng việc ấy (`learner` và `nemo`).

### 70c. Một bảng khoá-giá trị, không phải ba chục cột

`learner_ielts_profile_facts(learner_id, key, value, source, updated_at)`. Câu chọn nhiều thì nhiều
dòng cùng `key`. Thêm một câu hỏi mới **không cần migration**.

Cái giá, nói ra để sau không ai ngạc nhiên: CSDL không ràng buộc `key` phải là câu có thật. Luật ấy
nằm ở `learnerProfile.ts`, và đó là chỗ DUY NHẤT được quyết câu nào tồn tại — server đọc nó để lọc
đầu vào, màn hình đọc nó (qua API) để vẽ. Màn hình chỉ giữ phần CHỮ tiếng Việt.

### 70d. Lưu theo TỪNG THẺ

Sáu thẻ, sáu `EditGate`, sáu nút Save. Một nút cho cả trang thì learner phải cuộn qua mười chín câu
mới tới nó, và bấm Cancel ở cuối trang sẽ vứt luôn thẻ đầu tiên họ vừa điền. PUT vì thế chỉ thay
trọn những CÂU được gửi lên, không đụng câu nào khác — có ca gác riêng, vì một lượt ghi xoá nhầm
năm thẻ kia vẫn trả 200.

### 70e. Hai lỗi thật tìm ra khi dựng trang này

1. **`useRegisterSave` tạo vòng vẽ vô tận.** Form con viết `run: () => {...}`, tức một hàm mới ở
   mỗi lượt vẽ; để nó trong danh sách phụ thuộc thì effect chạy lại → `setSave` ở `EditGate` → vẽ
   lại → hàm mới → lặp. Nó không làm màn hình đứng, chỉ làm giao diện chập chờn. Nay `run` đi qua
   một ref.
2. **Bấm Save xong vẫn ở chế độ sửa.** Learner nhìn một màn hình không đổi gì và tự hỏi mình đã lưu
   chưa. Nay `EditGate` chờ Promise của `run` rồi đóng; lưu hỏng thì GIỮ chế độ sửa, để thứ vừa gõ
   còn nguyên mà thử lại.

### 70f. Năm ca e2e bị xoá nhầm, đã khôi phục

Script dọn ca của tôi ở SRC-957 và SRC-960 lùi quá xa khi tìm đầu một `test(`, nên nó nuốt luôn ca
đứng trước ca cần xoá. Mất năm ca: ba ca `/ielts/settings`, một ca Learning Setup, một ca Learning
plan — trang của chúng vẫn đang chạy. Đã khôi phục từ lịch sử git và chỉnh cho khớp hành vi hôm nay.

## 79. Chưa đo điểm thì bắt đầu từ 5.0 (SRC-977, 22.09.2026)

Chỉ đạo chủ dự án: *"nếu điểm Current không có, thì hệ thống mặc định cả 4 skills đều ở mức 5.0"*.

Mặc định này KHÔNG được im lặng, vì một con số bịa trông y hệt một con số đo được: thẻ Current
ghi thẳng "not measured yet, starting at 5.0", và learner sửa ngay tại chỗ bằng nút Edit của
chính thẻ ấy. Nó cũng không ghi xuống `ielts-baseline` - chỉ là điểm khởi đầu để vẽ bảng, không
phải một lời khai thay learner. Target thì vẫn bắt buộc: đích đến là thứ duy nhất hệ thống không
đoán hộ được.

## 86. Ngày sinh, trường, lớp: khai ở đầu Learner Profile (SRC-983, 22.09.2026)

Chủ dự án hỏi ba thông tin này nên khai ở đâu. Câu trả lời bắt đầu bằng một điều đã có sẵn: chúng
**không phải dữ liệu mới**. Bảng `learners` đã có `birth_date`, `grade`, `current_school`,
`province` từ SRC-518; trang Hồ sơ của learn (`/profile`) đã khai đủ; và chúng còn là điều kiện
`profile_complete` của onboarding.
Vấn đề thật là learner vào thẳng sân IELTS thì **không bao giờ đi qua trang ấy**: menu tài khoản
trong `/ielts/**` trỏ sang `/ielts/profile`, một trang nói về IELTS chứ không về danh tính. Ba ô
kia vô hình, nên với learner chúng cũng như không tồn tại.

**Chỗ khai: một thẻ "Con là ai" đứng đầu `/ielts/learner-profile`.** Đó là trang vừa dựng ở
SRC-963 làm chỗ learner tự mô tả mình, và mô hình của nó đã có sẵn tầng `identity`. Thẻ ghi thẳng
vào `learners` qua `PATCH /profile`.

**KHÔNG chép sang `learner_ielts_profile_facts`.** Một bản sao nghĩa là một đứa trẻ có hai ngày
sinh, và không lỗi nào nổ ra cho tới ngày hai bản ấy lệch. Đây cũng là lý do thẻ không có ô sửa
tên hiển thị: đổi tên là việc của trang Hồ sơ.

**Không chặn, chỉ nhắc** (chỉ đạo cùng lúc). Thiếu thì thẻ đeo một nhãn "còn thiếu N mục" và ô
trống ghi "chưa điền"; learner vẫn luyện bài được ngay. Chặn một đứa trẻ ở cửa bằng một biểu mẫu
hành chính là cách nhanh nhất để nó không quay lại.

Phép kiểm dùng lại `validateProfile` (SRC-327), gồm cả luật tuổi phải khớp lớp: hồ sơ rác không
chỉ xấu, nó là đầu vào của bộ chọn bài. Ngày cho người đọc vẫn DD.MM.YYYY, ô nhập vẫn `type=date`.

## 102. Learner Profile tối giản, tám câu, có ảnh thật (SRC-1016, 23.09.2026)

* **19 câu, sáu thẻ → 8 câu, bốn thẻ.** Giữ câu đổi được việc Nemo làm ngày mai: mục đích + câu tự
  viết, cách học + khi bí, giờ học + độ dài buổi, cản trở + kiểu giúp. Bỏ thẻ Confidence và
  Experience cùng các câu phụ của Environment/Motivation. Câu trả lời cũ không bị xoá
  (`writeProfileFacts` chỉ thay khoá được gửi), nhưng server không nhận khoá đã bỏ nữa.
* **Tối giản:** bỏ đoạn giới thiệu, ghi chú dưới tên thẻ, nhãn "ít khi đổi"; bộ đếm còn `0/8 câu`.
* **Ảnh thật** đứng trong thẻ "Con là ai", bấm vào ô tròn để chọn, không cần Edit/Save. Dùng lại
  `/v1/learners/{id}/photo` (SRC-739): chỉ người nhà và thầy cô xem được.
* **Nén dưới 200 KB trên máy** (`apps/learn/src/compressImage.ts`): canvas, JPEG, hạ chất lượng
  trước rồi mới thu nhỏ, cạnh dài tối đa 800 px. Nén nằm trong `selfProfile.uploadPhoto` nên mọi chỗ
  tải ảnh đều qua. Server hạ trần từ 5 MB xuống 200 KB để client cũ không lách được.

## 104. Learner Profile nói tiếng Anh đơn giản (SRC-1019, 24.09.2026)

Chủ dự án: *"Chuyển toàn bộ sang tiếng Anh, nhưng kiểu tiếng Anh đơn giản, mà 10 tuổi vẫn hiểu
được."* Đây là ngoại lệ có chủ ý với SRC-953 (chữ hướng dẫn trong sân luyện nói tiếng Việt), chỉ
cho `/ielts/learner-profile`. Luật viết: câu ngắn, từ thông dụng, không thành ngữ, không danh từ
trừu tượng (thẻ "Why IELTS?", "How you like to learn", "When you study", "What stops you").
Lỗi kiểm hợp lệ và lỗi ảnh từ các module dùng chung (vốn tiếng Việt) được thay bằng câu tiếng Anh
ngay tại trang, không sửa module gốc vì trang Hồ sơ và onboarding vẫn nói tiếng Việt.

## Lịch sử quyết định

### Từ mục 37. Hồ sơ riêng của IELTS Learner, và hai chỗ gập lại (SRC-910, 2026-09-20)

Vòng feedback chiều 2026-09-20, ba việc từ hai ảnh chụp màn hình.

Chỉ đạo: *"Có link tới trang Profile, nhưng đó là trang Profile chung, có quá nhiều thông tin. Tôi
cần một trang profile khác, tương tự như trang Profile chung hiện nay, nhưng URL nằm trong khu vực
ielts, và nó là Profile cho IELTS Learners."*

Chỉ đạo: *"Sign-out thì nhìn bị lỗi."* Ảnh chụp cho thấy thẻ "Account" treo lơ lửng dưới thanh
trên, mất nửa trên, nền mờ chỉ phủ một dải.

Chỉ đạo: *"Trang này cần collapse nhiều chỗ lại, cho gọn gàng. Giảm 50% elements trên trang (lúc
hiển thị ban đầu)."*

### Từ mục 62. Trang Goal và đầu trang Learning Setup, dọn lần nữa (SRC-954, 22.09.2026)

Hai chỉ đạo chủ dự án 22.09.2026, kèm ảnh chụp `/ielts/setup/goal` và `/ielts/setup`.

> *"Khi mới vào trang này, thì cần không hiển thị mấy dấu cộng hay trừ. (…) lúc đó learner mới đổi
> được ngày và lúc đó các icon cộng và trừ mới hiển thị và hoạt động được."*

> *"Đổi label này '5 of 5 steps done' thành từ tiếng Anh siêu đơn giản cho học sinh 10 tuổi cũng
> hiểu, đại ý là 'chỗ này giúp NEMO hiểu bạn (…) để hỗ trợ bạn được sát hơn'. Bỏ hết các labels và
> cụm này đi (…)"*

### Từ mục 63. Hai cột, dấu tròn đặc, và Study context về đúng chặng (SRC-955, 22.09.2026)

> *"Các icon ở đầu các dòng, cần là dạng icon tròn. Completed thì là hình tròn đặc màu da cam. Cho
> nhỏ chiều ngang của các card lại để chỉ còn 45% tới 50% so với chiều ngang hiện nay. Cột trái
> hiển thị cụm 1 và 2. Còn cột phải hiển thị cụm 3, 4, 5. Chuyển cụm nhỏ 'Study Context' vào trong
> cụm 2 'Starting Point'."*

### Từ mục 64. Trang Goal thành hai thẻ, và ba lối vào cho "lần thi gần nhất" (SRC-956, 22.09.2026)

> *"Bên trái là 'lần thi gần nhất', bên phải là card 'điểm mục tiêu'. Trong card 'lần thi gần
> nhất', learner có thể chọn ngay từ đầu là tôi chưa thi IELTS bao giờ, và đây là điểm dự đoán của
> tôi (khi đó hệ thống sẽ hiển thị 4 skills để đoán), hoặc 'tôi không dự đoán' và khi đó hệ thống
> sẽ không hiển thị 4 điểm skills để đoán nữa. Những cái này hiển thị sau khi bấm nút Edit. Còn
> mặc định khi mới vào thì màn hình là Read-Only hết."*

### Từ mục 70. Learner Profile thay hẳn Study context (SRC-963, 22.09.2026)

Chỉ đạo: *"Bỏ luôn trang Study Context hiện tại. Tạo trang Learner Profile mới tinh để thay thế."*
Bản mô tả đi kèm (sáu thẻ, ba tầng thông tin) là của chính chủ dự án; phần dưới ghi những chỗ bản
dựng khác bản mô tả, và vì sao.

### Từ mục 79. Chưa đo điểm thì bắt đầu từ 5.0 (SRC-977, 22.09.2026)

Trước đây thiếu điểm hiện tại là cả trang Learning Plan không dựng bảng, và learner mới - đúng
những người cần một kế hoạch nhất - gặp một màn trống bảo họ đi đo điểm trước. 5.0 là mức khởi
đầu thông thường của learner Việt Nam vào ôn IELTS.

### Từ mục 102. Learner Profile tối giản, tám câu, có ảnh thật (SRC-1016, 23.09.2026)

Chủ dự án: *"Cần chỉnh màn hình này để minimal. Giảm 50% lượng thông tin cần lấy. Cần cho phép
learners upload ảnh thật lên. Trước khi lưu trên server, thì ảnh cần được nén để không lớn quá 200KB."*
