---
url: >-
  https://docs.nemo12.com/architecture/sdd-029-public-site-ia/oceanic-rounds-2.md
description: >-
  Lược element trang môn, tag tiếng Anh, chương trình Marlin ngừng bán, trang 15
  khoá bố mẹ, học phí ba mốc, hero IELTS.
---

# SDD-029 · Oceanic, vòng sửa SRC-820 tới SRC-920

Một phần của [SDD-029](./index.md). Lược element trang môn, tag tiếng Anh, chương trình Marlin ngừng bán, trang 15 khoá bố mẹ, học phí ba mốc, hero IELTS.

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

#### 11.25 Trang môn và chân trang: lược bớt element (SRC-820)

Chỉ đạo chủ dự án 2026-09-18, kèm ảnh chụp ba khối: **bớt khoảng 30% element và chữ thừa** ở hero,
thang CEFR và khối Mentors, và **bớt 50% link ở chân trang**.

**Hero.** Bỏ ba viên `facts` ở cả hai vai (chúng lặp lại điều mà phiếu điểm ngay bên cạnh đã cho
thấy), bỏ dòng "IELTS on Computer Academic" dưới con số lớn, và ba luật đọc phiếu rút còn MỘT dòng:
luật làm tròn Overall. Hai luật kia — band 0 tới 9 nửa bước, mức sàn từng kỹ năng — đã hiện sẵn
trên chính phiếu và trên thang CEFR bên dưới. Câu dẫn của vai bố mẹ rút còn một dòng, vì cột chữ
trong hero hai cột chỉ rộng một nửa.

**Thang CEFR.** Câu dưới tiêu đề rút còn lời mời bấm. Bỏ nhãn "Đang chọn:" (viên band ngay cạnh đã
nói điều đó) và bỏ viên `C1 · Proficient user` ở đáy thẻ, vì cột dọc bên trái thang đã ghi đúng ba
nhóm ấy.

**Mentors.** Trần sáu thẻ hạ xuống **bốn**, và bỏ đoạn văn kết dưới lưới thẻ — nó nói lại ý của câu
dưới tiêu đề, dài hơn, và đứng chắn giữa các gương mặt với lối đi tiếp. Prop `persona` theo đó
không còn ai đọc nên gỡ khỏi `MentorsSection`.

**"Đọc tiếp".** Trần **sáu thẻ**, cùng con số mà `ContentPage` đã dùng cho khối cùng tên ở SRC-730.
IELTS khai mười một mục, và mười một thẻ giống nhau xếp thành bốn hàng thì không còn là một lối đi
tiếp mà là một mục lục, đặt đúng chỗ người đọc vừa đọc xong phần chính và chỉ cần MỘT bước kế. Phần
còn lại vẫn tới được từ khu sâu của môn, vốn là mục đầu tiên của chính danh sách này.

**Trang học phí (`/{vai}/university/ielts/tuition`).** Trang có HAI tiêu đề nói cùng một câu: một
dải trắng chỉ chứa `h1` "Ôn bao lâu, và hết bao nhiêu tiền", rồi ngay dưới là dải tối mở đầu bằng
"Ôn bao lâu, hết bao nhiêu", giữa hai lần không có nội dung nào. Nay chỉ còn `h1`, đứng thẳng trên
thẻ máy tính: câu hỏi và câu trả lời nhìn thấy cùng lúc. Dải "Vì sao là 200 giờ" bỏ hẳn - nó dựng
cả một khối cho đúng một câu, mà câu ấy là chú thích cho con số nằm ngay trên, nên nó nối vào dòng
điều kiện dưới thẻ, giữ nguyên link tới trang 11 tài liệu Cambridge. Ba viên `tag` trên thẻ chính
sách bỏ (ba thẻ vốn đã xếp theo đúng trục thời gian ấy), câu dẫn dưới tiêu đề "Nếu không hợp thì
sao" bỏ, và hàng ba link phụ trong "Bước tiếp theo" bỏ - chân trang trang môn mang đúng ba lối ấy,
và năm nút viền trong một khối tên là "Bước tiếp theo" thì không còn bước nào là bước tiếp.

**Chân trang.** Cột đầu của trang môn có **trần năm dòng**: bốn dòng đầu của `deep.links` (đã xếp
theo thứ tự quan trọng ngay trong `subjectCopy.ts`) cộng lối lùi một bậc về trang mục tiêu, luôn
đứng cuối. IELTS trước đó đổ cả mười một mục xuống đây. Chân trang của khu IELTS và khu SAT rút từ
bảy link còn bốn, cột giữa của trang môn bỏ "Bắt đầu" (nút Đăng nhập trên thanh làm đúng việc ấy),
và câu `blurb` dưới tiêu đề cột không còn dựng: ở chân trang nó mô tả lại trang mà người đọc vừa
đọc xong, đặt đúng chỗ họ đang tìm một cái link.

#### 11.26 Tag tiếng Anh, ba đích đến, và dải cho vệt đường dẫn (SRC-820, vòng hai)

Chỉ đạo chủ dự án 2026-09-18, sau khi xem lại trang môn IELTS.

**Mọi `eyebrow` chuyển sang tiếng Anh.** "Tiêu chuẩn quốc tế" → `CEFR scale`, "Mức yêu cầu" →
`Target band`, "Đội ngũ" → `Team`, "Chính sách" → `Policy`, "Kỳ thi" → `Exams`, "Hải trình luyện
thi" → `Journey`, và tương tự ở các trang con IELTS, Parents, Stories, Core. Đây là NGOẠI LỆ có
chủ đích với luật "chữ người dùng đọc là tiếng Việt" (SRC-604): eyebrow không phải câu để đọc mà
là một nhãn phân loại dài hai ba chữ, đứng trên tiêu đề tiếng Việt và không mang thông tin nào mà
tiêu đề không nói. Luật cũ vẫn giữ nguyên cho mọi chữ còn lại.

**Hero của trang môn IELTS:** eyebrow rút từ "IELTS Diagnostic & Strategy · marine edition" còn
`IELTS Diagnostic`.

**Dòng luật đọc phiếu bỏ hẳn**, và `IeltsScoreRules` xoá theo. Chính phiếu điểm dạy luật làm tròn
bằng cách bấm được - hạ Writing nửa band rồi nhìn con số lớn đứng yên - còn dòng "Sensor readout"
trong phiếu cho người muốn kiểm tự đối chiếu.

**`TARGETS` còn BA đích đến:** "Đại học Việt Nam", "Du học Anh, Úc, Canada", "Thạc sĩ". Bản trước
tách Anh khỏi Úc/Canada/New Zealand dù hai nhóm cùng dải Overall 6.0-6.5 và chỉ khác mức sàn từng
kỹ năng - một khác biệt nói trong câu ghi chú được, không cần tốn một nút. "Định cư và làm việc" bỏ
vì nó không thuộc câu hỏi mà trang này hỏi: trang đứng trong khu `university`.

**Một khối nhỏ dẫn sang trang chẩn đoán**, đứng ngay sau thang CEFR: người đọc vừa biết band của
mình NGHĨA LÀ GÌ, nên câu kế tiếp trong đầu họ đúng là "vậy band của tôi bao nhiêu, thiếu ở đâu".
Dựng theo đúng khuôn thẻ ngang của khối Học phí (một tiêu đề, một câu, một nút) và lấy `href` từ
`deep.links` chứ không gõ tay - hai bản chép tay sẽ lệch ngay lần đổi URL đầu tiên.

**Thứ tự bốn kỹ năng trên trang chẩn đoán: Reading · Listening · Writing · Speaking**, đúng thứ tự
bốn phần của một buổi thi. Áp cho cả bảng tiêu chí, bảng band theo mốc và biểu đồ 12 tháng. Lưu ý
khi sửa tiếp: `BANDS` đi theo CHỈ SỐ của mảng `SKILLS`, nên đổi thứ tự ở một chỗ mà quên chỗ kia là
bảng nói sai số mà không cổng nào bắt được.

**Hàng cụm trong bảng tiêu chí không còn nhãn phụ (SRC-856, 2026-09-19).** Trước đó mỗi hàng cụm
mang thêm một dòng chữ nhỏ cạnh tên kỹ năng: "sub-skills, not official criteria" cho Reading và
Listening, "official band descriptors" cho Writing và Speaking. Chỉ đạo chủ dự án: bỏ cả bốn. Lý do
là bảng này để phụ huynh quét mắt tìm con số tiến bộ, mà bốn dòng chữ ấy nói về CÁCH IELTS chấm -
một chuyện đúng nhưng không thuộc về ô đang đọc, và nó chen ngay vào chỗ mắt dừng. Chỗ nói kỹ sự
khác nhau giữa năng lực con và tiêu chí chấm chính thức là trang giải thích báo cáo. Lưu ý khi sửa
tiếp: đừng thêm lại nhãn ấy dưới dạng tooltip hay chú thích chân bảng - quyết định là bỏ khỏi bảng,
không phải dời chỗ.

**Tên sub-skill của Reading và Listening rút gọn, mỗi kỹ năng đúng năm mục (SRC-855, 2026-09-19).** Reading:
General understanding · Main ideas · Detail · Inference · Writer opinion and purpose — tách "main ideas and details"
thành hai mục, bỏ "development of an argument" vì nó xuyên suốt cả năm mục chứ không đứng riêng. Listening: Main
ideas · Factual detail · Speaker opinion · Speaker purpose · Development of ideas — trước chỉ bốn mục vì gộp main
ideas với factual detail. Band của mục mới tách lấy từ dải cũ nên đường tiến bộ không nhảy.
Danh sách này bám đúng bộ sub-skill IELTS công bố, nên đừng gộp lại cho gọn: Detail và Main ideas là hai
năng lực khác nhau, và learner hỏng ở Detail thì bài chữa khác hẳn learner hỏng ở Main ideas.

**Lộ trình 12 tháng trên trang chẩn đoán** (`StudyPlan`, đứng TRƯỚC biểu đồ band): tháng 1 chỉ
Reading, tháng 2 thêm Listening, tháng 3 thêm Writing, tháng 4 thêm Speaking, và kỹ năng đã vào thì
ở lại tới hết tháng 12. Thứ tự ấy không phải để cân đối mà vì mỗi kỹ năng sau đứng trên vốn của kỹ
năng trước: đọc dựng vốn từ nhìn thấy được, nghe là chính vốn ấy qua tai, viết cần vốn đủ để diễn
đạt, còn nói chạy trong thời gian thực nên cần ba thứ kia đã tương đối vững.

**Biểu đồ band CẮT theo lộ trình** (chỉ đạo chủ dự án 2026-09-18, vòng ba). Mỗi đường kỹ năng bắt
đầu ở đúng tháng kỹ năng ấy vào học (`SERIES_START`), và có một chấm đánh dấu chỗ bắt đầu để đường
không mọc ra từ hư không; chú giải ghi thêm "từ tháng N". Overall chạy suốt vì nó là band của cả
bài thi, thứ luôn đo được. Trước đó bốn đường cùng chạy từ tháng 0, nên biểu đồ vẽ Speaking đi lên
trong ba tháng mà khối lộ trình ngay trên nói là chưa học Speaking - hai khối cạnh nhau nói hai
điều khác nhau.

Cái phải chấp nhận, ghi ra để đừng ai "sửa lại cho đủ": bài chẩn đoán đo cả bốn kỹ năng ngay từ
ngày đầu, nên bảng tiêu chí bên dưới VẪN có số của lần đo 1 cho cả bốn. Biểu đồ nay vẽ phần band
đi kèm việc học, không vẽ phép đo đầu tiên của kỹ năng chưa tới lượt.

Đường **Overall tắt sẵn** (cùng chỉ đạo): nó dày nhất và nằm giữa dải bốn kỹ năng nên che đúng chỗ
đáng nhìn. Từ khi bốn đường bắt đầu lệch nhau theo lộ trình, thứ người đọc tới đây tìm là khoảng
cách GIỮA các kỹ năng chứ không phải con số tổng. Một cú bấm trong chú giải là bật lại được, và các
chấm mốc đo (vốn gắn với Overall) ẩn hiện theo nó.

Lưu ý khi sửa: `path()` nhận thêm tham số `from` để dời cả đường sang phải; thiếu nó thì đường bị
nén về đầu trục và mọi mốc đo nằm sai chỗ.

Bố cục là HÀNG FLEX chứ không phải một lưới mười ba cột chung: lưới chung vỡ ở 375px (cột nhãn cộng
mười hai cột làm mỗi cột chưa tới 2px và nhãn tràn đè lên thanh màu). Trên điện thoại nhãn đứng
thành một dòng riêng mang theo "từ tháng N", và hàng số tháng ẩn đi vì mười hai con số ở bề ngang
ấy không đọc được.

**Vệt đường dẫn có dải nền riêng.** Trước đó nó trong suốt nên dính vào nền trang và đọc thành
dòng đầu tiên của nội dung, trong khi việc của nó là nói vị trí - cùng loại với thanh điều hướng.
Nay ba tầng có ba nền: thanh trên `bg-sand/85` có làm mờ hậu cảnh, vệt đường dẫn `bg-muted/60`, rồi
nội dung trở về nền trang, với hai đường kẻ mảnh trên dưới.

#### 11.27 Vòng bốn: bỏ cụm ba mốc, logo NEMO IELTS, và ba sửa nhỏ (SRC-820)

Chỉ đạo chủ dự án 2026-09-18, sau khi xem trang chẩn đoán và trang môn IELTS đang chạy.

**Bỏ hẳn cụm "Báo cáo của bạn qua ba mốc".** Nó là khối lớn nhất trang: ba tab mốc thời gian, một
cột thanh band, một biểu đồ xu hướng nhỏ và một danh sách mười mục gập mở. Hai trong ba thứ nó nói
nay đã có chỗ tốt hơn ngay trên nó - lộ trình nói mốc thời gian, biểu đồ 12 tháng nói band đi tới
đâu. Xoá theo cả mã chết: `SkillBars`, `TrendChart`, `ReportRow`, và các hằng `STAGES`, `ITEMS`,
`BANDS`, `TARGET`, `SKILLS`, `STAGE_ORDER` cùng hai kiểu `StageId`, `Item`.

**Chú giải biểu đồ thành HAI DÒNG**: tên kỹ năng trên, con số dưới. Một hàng ngang làm mỗi viên dài
rất khác nhau ("Speaking từ tháng 4 · 5.5 lên 7.5" gấp đôi "Reading 5.5 lên 8.0"), nên năm viên xếp
thành hai hàng so le và tên kỹ năng bị con số đẩy khỏi chỗ mắt dừng.

**Vệt đường dẫn: cấp MÔN bấm được**, trỏ về chính trang môn. Đây là nới luật SRC-780 (chỉ Home bấm
được) và chỉ nới đúng một cấp: đứng ở một trang con IELTS thì lối lùi một bậc về trang môn là lối
người đọc tìm nhiều nhất, mà thanh điều hướng không có mục nào trỏ về đó. Cấp không khai `href` vẫn
là chữ thường - một cấp bấm được mà dẫn tới trang chưa có thì tệ hơn một cấp không bấm được.

**Phiếu điểm đỏ trở lại, và đây là một LỖI chứ không phải đổi ý.** `--n12-www-red` chỉ được khai
trên `.n12-scoreband` - cái dải tối mà phiếu từng nằm trong. Từ SRC-793 phiếu chuyển vào hero và
không còn tổ tiên nào mang lớp ấy, nên biến rơi về rỗng và con số Overall, bốn con số kỹ năng, viên
eyebrow, dòng readout đồng loạt thừa kế màu chữ đen. Nay chính `.n12-scorecard` cũng khai biến. Bài
học chung: một biến khai ở tổ tiên là một biến sẽ mất khi thành phần đổi chỗ.

**Logo đọc "NEMO IELTS" trong khu IELTS.** Nhận theo ĐƯỜNG DẪN chứ không theo `context.label`, vì
hai nhánh trang IELTS nằm ở hai khu khác nhau: `/ielts/*` là khu kỳ thi, còn
`/{vai}/university/ielts*` thuộc khu mục tiêu mang nhãn "Vào đại học". Người đọc không phân biệt
hai nhánh ấy nên logo phải nói cùng một thứ ở cả hai. Dòng phụ "Marine IELTS Lab" và chip nhãn khu
ẩn đi ở đó - ba thứ cùng nói chữ IELTS thì hai thứ sau chỉ là tiếng vọng.

**Trang lộ trình (`/{vai}/university/ielts/journey`)** đổi màu và đổi tiêu đề. Số thứ tự, mũi tên
và viền của thẻ đang mở đều lấy `accent`; nền hover đổi từ `bg-muted/40` sang `bg-accent/10` - trên
dải tối, nền xám mờ sáng lên thành một mảng chói to bằng cả thẻ và là thứ nổi nhất màn hình dù chỉ
là trạng thái di chuột. Phụ đề mỗi bước nhỏ và mờ hơn một bậc (`text-sm`, `text-muted-foreground/70`)
vì nó đọc sau tên bước, không được cạnh tranh với tên bước.

Tiêu đề đổi từ "Năm bước, theo đúng thứ tự" sang **"Từ band đang có tới band cần"**: tiêu đề cũ mô
tả cái danh sách ngay bên dưới, thứ mắt đã thấy, nên nó không thêm gì; câu dẫn cũ còn kể trước nội
dung của năm bước, tức là bắt người đọc đọc bản tóm tắt trước bản thật. Câu dẫn mới nói cái được
sau mỗi bước, khác nhau theo vai. `h1` và `title` trong `routes.ts` sửa theo cho khớp - bản tĩnh
mang tiêu đề khác bản thật là hai trang nói hai điều ở cùng một URL, mà Google đọc bản tĩnh.

**Ba sửa chữ:** bỏ gạch chân (`h1Swash`) ở tiêu đề trang môn IELTS cả hai vai; câu dưới "Mentors"
đổi thành "Những thầy cô thiết kế ra NEMO IELTS và những người sẽ đồng hành cùng bạn mỗi tuần";
và trần thẻ mentor quay lại **sáu** sau khi hạ xuống bốn ở §11.25 - hạ trần là cách cắt bớt tệ nhất
ở một khối nói về người thật, vì nó giấu hẳn một con người (Tú Minh) mà không ai biết trừ khi tình
cờ đếm. Muốn khối ngắn lại thì rút chữ trong từng thẻ.

#### 11.28 Ba chương trình Marlin ngừng bán: ẩn thẻ, gỡ trang, giữ link (SRC-869)

`marlin-start` · `marlin-compass` · `marlin-mind` mang cờ `retired: true` từ [SRC-671](../../intake.md)
— chủ dự án thay ba khoá ấy bằng 15 khoá mới. Nhưng `nemo12.com` **không đọc cờ đó**, nên tới
2026-09-19 ba chương trình đã ngừng bán vẫn đang được chào bán công khai. Cờ và nơi đọc cờ nằm ở hai
file khác nhau, và không có gì nối chúng lại — đúng loại sai mà chỉ người đi tìm mới thấy.

**Phát hiện làm đổi phạm vi:** ba gói ấy là **toàn bộ** `forWhom: "parent"`. Ẩn chúng thì
`/parents/programs` không còn gì để bày, trong khi trang ấy đang được trỏ tới từ thanh điều hướng,
trang `/parents`, `CorePages` và `ParentsPages`. Nên việc này không dừng ở "ẩn ba thẻ".

**Chủ dự án chốt: chuyển hướng luôn cả trang danh sách về `/parents`.** Đã làm:

| Chỗ | Làm gì |
| --- | --- |
| `ProgramsPage` | lọc thêm `!p.retired` |
| `ROUTES` | không sinh trang chi tiết cho gói `retired`; gỡ hẳn route `/parents/programs` |
| `ALIASES` | `/parents/programs`, ba URL chi tiết, `/marlin-programs` và ba bí danh `/programs/marlin-*` đều về **thẳng** `/parents` |
| Điều hướng | gỡ mục "Chương trình cho bố mẹ" khỏi `SiteNav`, `/parents`, `CorePages` |
| `ParentsPages` | câu "Ba chương trình Marlin…" sửa thành câu không còn khai ba chương trình; gỡ nút "Xem chương trình" |

**Ba quyết định nhỏ, và lý do:**

1. **Bí danh trỏ THẲNG `/parents`**, không nối qua `/parents/programs`. Một bí danh trỏ vào bí danh
   khác là hai lần đổi địa chỉ cho một cú bấm, và là mắt xích mà một ngày nào đó có người gỡ.
2. **Không trỏ sang `marlins.nemo12.com`** dù 15 khoá mới sống ở đó: cổng ấy là **tường đăng nhập**
   (đã kiểm: `/parent-courses` trả về màn "Đăng nhập bằng Google"). Một nút công khai dẫn thẳng vào
   tường đăng nhập đọc ra như một lời mời hụt.
3. **Gỡ khỏi sitemap nhưng KHÔNG để 404.** Worker dựng `SPA_PATHS` từ chính `Object.keys(ALIASES)`
   ([§6](#_6-worker-404)), nên bốn địa chỉ mới tự động được trả 200 + SPA và bí danh chạy ở client.
   Không phải khai thêm ở đâu — đó là cái lợi của việc worker đọc cùng một nguồn với prerender.

**Còn lại, nói ra để không ai tưởng đã xong:** `nemo12.com` nay không có chỗ nào nói Nemo12 có
chương trình cho bố mẹ. Muốn có lại thì cần một trang công khai mô tả 15 khoá — việc đó chưa dựng.

#### 11.29 Trang công khai của 15 khoá bố mẹ — `/parents/programs` sống lại (SRC-873)

[§11.28](#_11-28) gỡ ba chương trình Marlin và để lại một câu: *"nemo12.com nay không có chỗ nào nói
Nemo12 có chương trình cho bố mẹ"*. Trang này lấp đúng khoảng đó.

**Đứng ở CHÍNH địa chỉ cũ**, không mở URL mới. `/parents/programs` đã nằm trong sitemap đã nộp và
trong link người đọc lưu; cho nội dung thay thế đứng đúng chỗ ấy thì một link cũ dẫn tới thứ đã thay
thế nó, thay vì đổ người đọc về trang chủ khu bố mẹ. Ba bí danh `marlin-*` vì thế đổi đích từ
`/parents` sang `/parents/programs`.

**Không hiện giá** (chỉ đạo chủ dự án). Trang mô tả 15 khoá; con số nằm trong Marlins.

**Dữ liệu KHÔNG gõ tay, và đây là phần đáng đọc nhất của mục này.** Trang cần tên 15 khoá, nhóm và
một câu mỗi khoá. Dữ liệu ấy đã có ở `apps/marlins/src/parentCoursesData.ts` — nhưng nằm trong app
MARLINS, mà web thì không import chéo app được. Ba đường đi, chọn đường thứ ba:

| Cách | Vì sao bỏ / chọn |
| --- | --- |
| Chép 15 dòng sang web | Tạo bản thứ hai của cùng một dữ liệu — đúng thứ [coding-conventions §6](../../engineering/coding-conventions.md) vừa cấm sau khi hai bản `packages.ts` lệch nhau gần một ngày |
| Chuyển cả module sang `packages/` | 20 file đang import nó, gồm bộ sinh và cổng kiểm. Một cuộc dọn nhà lớn cho một trang giới thiệu là đổi sai thứ |
| ✅ Sinh một bản TÓM TẮT | `scripts/curriculum/gen-parent-summary.mjs` đọc chính file kia, ghi `packages/parent-courses/index.ts`. Một nguồn (D1), không bản chép tay nào |

Bản tóm tắt **cố ý chỉ mang phần công khai**: code, tên, nhóm, `job`, số unit. Không mang pains,
outcome hay lesson — đó là nội dung người học trả tiền để đọc, không phải chữ của trang giới thiệu.

**Có cổng canh, không dựa vào trí nhớ.** `check-parent-courses.mjs` sinh lại bản tóm tắt rồi so; lệch
là CI đỏ (đã thử phá một con số để chắc cổng thật sự bắt). Và `pull-parent-courses.mjs` chạy bộ sinh
ấy ngay trong vòng có sẵn, nên người sửa nội dung trong Coral không phải nhớ thêm một lệnh nào.

**Nút "Vào Marlins" nói trước rằng cần tài khoản.** Cổng ấy là tường đăng nhập; một nút công khai
dẫn vào đó mà không báo trước đọc ra như một lời mời hụt.

##### Vòng hai (SRC-880): mở `pains` và `outcome` ra công khai

Chủ dự án chốt đưa thêm **4 nỗi đau** và **4 điều làm được** của mỗi khoá lên trang. Ranh giới mới:

| Công khai | Vẫn sau đăng nhập |
| --- | --- |
| tên khoá, nhóm, `job`, số phần, `pains`, `outcome` | tên unit, tên lesson, Big Idea, Essential Question, thân bài |

Lằn ranh ấy không tuỳ tiện: `pains` viết bằng **giọng của chính bố mẹ** (*"Tôi chỉ biết về con qua
điểm số và lời cô giáo nói"*) và `outcome` nói học xong làm được gì — hai thứ người ta cần đọc
**trước** khi quyết định. Giấu chúng sau tường đăng nhập là giấu nhầm chỗ. Còn unit và thân bài mới
là thứ người học trả tiền để đọc.

**Accordion, không phải lưới thẻ.** 15 khoá × 8 câu đổ hết ra một lưới thì trang dài gấp mấy lần màn
hình, và tên khoá — thứ người ta đang lướt để tìm — bị đẩy xa nhau. Dùng đúng khuôn
`CurriculumOutline` đang dùng, để site không có lối tương tác thứ hai cho cùng một việc.

**Bản tĩnh và bản chạy cố ý KHÁC nhau, và khác có lý do.** Radix tháo nội dung của mục đang đóng ra
khỏi DOM, nên nếu chỉ dựa vào React thì máy tìm kiếm đọc được đúng 15 cái tên. `paras` của route vì
thế mang đủ 60 câu kia — mà đó mới là thứ người ta gõ vào Google (*"con học mãi không tiến"*, *"không
biết con mạnh ở đâu"*). Đo trên bản build: HTML tĩnh của trang tăng từ ~1,5 nghìn lên 7,4 nghìn ký tự chữ.

#### 11.30 Học phí IELTS ba mốc, và dải chính sách còn một câu (SRC-908)

Chỉ đạo chủ dự án 2026-09-20, sau khi xem trang học phí đang chạy.

**Giá: ba mốc, và cả ba là DỮ LIỆU.** Không có con số tiền nào vào mã — luật này đã đặt ở
[§11.21](#_11-21) và lần sửa này là lần đầu nó được thử: đổi giá chỉ cần hai câu `UPDATE` trong
`scripts/seed-band-pricing-2026-09-20.sql`, không đụng `apps/web`, không chờ deploy web.

| Hiệu lực | Mỗi 1.0 band | Dòng `band_pricing` |
| --- | --- | --- |
| Trong tháng 9.2026 | 10.000.000đ | `band-sep-2026` (5 → 10 triệu) |
| 01.10.2026 tới hết 31.12.2026 | 15.000.000đ | `band-year-2026` (10 → 15 triệu) |
| Từ 01.01.2027 | 20.000.000đ | `band-base`, không đổi |

Trần sáu tháng cho mỗi 1.0 band vẫn chỉ khai ở dòng `base`; hai dòng `offer` để `max_months_per_band`
NULL và API điền hộ, đúng luật ở migration 0227. Sáu tháng trong lời chủ dự án trùng đúng con số ấy,
nên không có gì phải sửa — và không có bản sao thứ hai nào của nó ra đời.

`UPDATE` chứ không `INSERT ... ON CONFLICT`: bốn dòng ấy đã có mặt từ [SRC-792](../../intake.md). Một
câu chèn-nếu-thiếu ở đây sẽ nuốt mất tín hiệu "seed trước chưa chạy" — thứ duy nhất báo cho người
vận hành biết họ đang sửa một bảng không giống bảng họ tưởng.

**Dải "Nếu không hợp thì sao" thu lại còn MỘT câu:** *"Hoàn tiền 100% trong 30 ngày đầu tiên, bạn
không cần chia sẻ lý do."* Bỏ eyebrow "Policy", bỏ tiêu đề, bỏ cả ba thẻ và hàm `policies()`.

**Ba dòng chữ nữa bị bỏ khỏi dải giá** (cùng chỉ đạo, vòng hai). Dòng `terms_vi` dưới thẻ máy tính
(*"Áp dụng một lần cho mỗi học viên, và không quá 20 học viên."*) gỡ khỏi giao diện — cột vẫn còn
trong `band_pricing` và API vẫn trả về, nên một đợt sau muốn hiện điều kiện thì chỉ cần dựng lại chỗ
đọc. Hai câu rào mở đầu đoạn chú thích cũng bỏ: *"mức tham chiếu của cả nhóm"* và *"giờ có hướng dẫn
chưa tính giờ tự làm bài"*. Câu thứ hai lặp đúng nhãn `giờ có hướng dẫn` đang đứng ngay dưới con số
200 — nhãn ấy nói cùng điều bằng ba chữ. Đoạn còn lại chỉ nói nguồn, và câu nối sửa thành *"…cho một
bậc CEFR, tương ứng với khoảng 1.0 IELTS Band"* thay cho *"rộng khoảng 1.0 band"*: người đọc trang
này đang so đúng thang IELTS, nên gọi thẳng tên thang ấy.

Ba thẻ ấy nói ba điều, nhưng hai điều đã có chỗ khác trên chính trang này: hai buổi học thử là nút
chính của dải "Bước tiếp theo" ngay dưới, còn "không có phí ẩn" thì ô học phí ngay trên đã trả lời
bằng một con số. Thẻ thứ ba — hoàn tiền — là điều duy nhất chưa nói ở đâu, và nó dài đúng một dòng.
Một dải chiếm trọn màn hình để nhắc hai điều và nói một điều mới là ba thẻ đổi lấy một câu.

#### 11.31 Hero IELTS bỏ nút chính, và thanh trên mời học thử (SRC-920)

Chỉ đạo chủ dự án 2026-09-20, sau khi xem `/students/ielts` đang chạy.

**Bỏ hẳn nút "Tính điểm IELTS" ở hero vai học sinh**, cùng dòng "trong vòng 20 phút" đi kèm. Hero
này đã có phiếu điểm bấm được đứng ngay cạnh ([§11.23](#_11-23)), và ngay dưới là năm bước rồi lối
sang trang chẩn đoán. Một nút mời rời trang đặt trước tất cả những thứ ấy là mời người đọc đi trước
khi họ kịp biết mình sắp bỏ lại cái gì.

Bỏ nút = **bỏ nhãn khỏi dữ liệu**, không phải giấu nó bằng một cờ. `ctaPrimary` trong `subjectCopy`
thành không bắt buộc, và `GoalPages` không dựng cả hàng nút khi không có nút nào — một `div` rỗng
vẫn ăn khoảng cách của hero. Một nhãn còn nằm trong dữ liệu mà không chỗ nào hiện ra là thứ người
sửa sau này sẽ tưởng đang chạy.

Cổng `goals.test.ts` vì thế chỉ so "CTA hai vai không trùng nhau" **khi cả hai vai còn nút**. Bắt cả
hai phải CÓ nút là gộp hai luật khác nhau vào một dòng assert.

**Thanh trên: "Đăng nhập" thành "Học thử (Free)".** Đích không đổi — vẫn `loginHref`, tức trong khu
kỳ thi thì đi thẳng sang sân luyện ([§11.21](#_11-21), SRC-841) — chỉ đổi câu mời.

"Đăng nhập" là việc của người ĐÃ có tài khoản, mà phần lớn người đứng ở các trang công khai này thì
chưa. Với họ, nút nổi nhất trang đang nói một việc họ không làm được, nên nó trượt khỏi mắt. "Học
thử (Free)" nói đúng thứ đang được mời, và nói luôn cái giá của nó.
