nemo12.com — kiến trúc thông tin web công khai
Đây là trang người chưa có tài khoản nhìn thấy. Khác với marlins (xem marlins-ia/index.md), người đọc ở đây chưa tin ai, chưa biết ai dành cho ai, và rời trang bất cứ lúc nào. Toàn bộ luật dưới đây rút từ mười một chỉ đạo từ 2026-08-14 đến 2026-08-25 và trước đó chỉ tồn tại trong commit message.
Nguyên tắc xuyên suốt, phát biểu một lần tại SRC-559 rồi được các quyết định sau bám theo:
Trang chủ trả lời "đi đâu" · trang danh sách trả lời "có gì" · trang chi tiết trả lời "bao nhiêu, thế nào".
Mỗi tầng chỉ giữ đúng phần việc của mình. Thông tin bị đẩy xuống tầng dưới không mất, chỉ đổi chỗ.
1. Sitemap thật
/ trang chủ — hero hai cửa, lưới 5 school, hai cửa chương trình, dải đội ngũ NGẮN
/login ngã ba vai: "Tôi là bố mẹ" → marlins · "Con vào học" → learn (SRC-563)
Chương trình
/programs ĐÚNG 3 gói của con: Dive → Swim → 360 (SRC-557, SRC-558)
/marlin-programs ĐÚNG 3 gói của bố mẹ: Marlin Start · Compass · Mind (SRC-557, SRC-558)
/programs/{code} chi tiết một gói, dùng chung cho cả hai nhóm (SRC-553, SRC-555)
/goi/{code} [bí danh cũ] mở đúng trang rồi replaceState lặng sang /programs/{code}
Đội ngũ
/mentors trang Dolphins — toàn bộ thẻ mentor và cố vấn (SRC-560)
/mentors/{slug} hồ sơ riêng từng mentor (SRC-579)
Trường chuyên (còn sống, KHÔNG còn trên NavBar) (SRC-562)
/specialist-schools · /specialist-schools/{slug} · /specialist-schools/so-sanh
/turtle /shark /octopus /squid /whale2. Dòng phụ của school (SRC-085, 2026-08-14)
Hai school đổi dòng phụ trên thẻ và trang riêng:
| School | Dòng phụ chốt tại SRC-085 |
|---|---|
| Turtle | "Học chắc, không học vẹt, không hổng" |
| Squid | "Vào thẳng đại học bằng IELTS · SAT · AP" — bỏ chữ "English" |
Lý do bỏ "English": Squid không bán một môn học, nó bán một đường vào đại học; tên các kỳ thi nói điều đó cụ thể hơn tên môn.
Dòng phụ dùng chung một nguồn schoolsInfo.ts cho cả web · learn · marlins. Trạng thái hiện tại của Squid đã mở rộng thêm hai kỳ thi trong nước ("Vào đại học thuận lợi bằng IELTS, SAT, TSA, HSA, AP") ở một chỉ đạo sau; cấu trúc do SRC-085 đặt ra — kể tên kỳ thi, không kể tên môn — vẫn giữ.
3. Luật trang chương trình
3.1 Chia theo người học, không chia theo nhãn chữ (SRC-553)
Ba gói từng nằm chung một lưới, phân biệt bằng nhãn "DÀNH CHO BỐ MẸ". Nhãn chỉ đọc được sau khi người ta đã dừng lại; thứ mắt bắt trước là bố cục. Nay tách làm hai cụm có tiêu đề riêng — "Gói cho con" và "Gói cho bố mẹ" — nên câu "gói nào cho ai" được trả lời trước khi đọc chữ nào. Trường phân chia là forWhom (khác audience vốn chỉ là nhãn hiển thị).
Cùng lúc, mỗi gói có trang chi tiết riêng, và cả thẻ bấm được chứ không có link chữ CTA riêng (DS-001 §5b điều 7).
3.2 Slug tiếng Anh (SRC-555)
/goi/{code} → /programs/{code}. Lý do: slug là thứ người ta chép đi dán lại, trộn tiếng Việt vào một mã tiếng Anh (/goi/marlin-compass) đọc như lỗi.
/goi/* không chết: nó đã sống từ SRC-553 nên link có thể đã được chia sẻ. Nhánh cũ mở đúng trang rồi replaceState lặng sang URL mới — replace chứ không push, để nút back không kẹt trong vòng lặp.
3.3 Ba gói mỗi trang, không hơn (SRC-557, SRC-558)
- Bỏ gói bậc 2 chưa mở, đè Nemo Swim vào chỗ đó. Lộ trình của con thành Dive → Swim → 360: bậc 2 giờ là gói có giá và lịch thật thay vì một gói "Sắp mở".
- Hai trang danh sách tách hẳn:
/programsđúng 3 gói của con,/marlin-programsđúng 3 gói của bố mẹ. - SRC-557 từng thêm link chéo giữa hai trang; SRC-558 bỏ hẳn — mỗi trang còn đúng hero + 3 thẻ, không một dòng nào khác. Người vào trang "cho con" không cần được nhắc rằng còn nhóm khác.
- Nút back của trang chi tiết trỏ về đúng trang danh sách của nhóm (
forWhom === "parent"→/marlin-programs), không trỏ về trang chủ. - Link của gói đã bỏ đổ về
/programsbằngreplaceState, không rơi vào "không tìm thấy".
3.4 Ít chữ, nhiều hình, giá ở đúng một tầng (SRC-559)
- Hai trang programs lên NavBar.
- Trang danh sách bỏ giá. Thẻ chỉ còn: hình N12Art to (tàu ngầm = Dive, cá vượt sóng = Swim, địa cầu = 360, la bàn = Compass, vỏ ốc = Mind) + "Bước n" + tên + một câu.
- Trang chủ không nhồi thông tin gói, chỉ link. Khối Chi phí cũ thành hai cửa "Cho con / Cho bố mẹ", không giá, không mô tả.
- Trang chi tiết GIỮ giá — chỉ đạo chỉ bỏ giá ở trang danh sách. Các mục nội dung thành accordion đóng sẵn: ít chữ lộ ra, nội dung đầy đủ vẫn còn.
- Chất liệu "biển xanh sâu thẳm" (lớp
od-*) sống riêng trongapps/web/src/index.css, không vào Design System chung — chỉ đạo chỉ nói www, learn/marlins/coral giữ bảng gần-đơn-sắc. Ba tầng animation bằng CSS thuần thay vì three.js: cùng ấn tượng với 0KB thư viện (three.js ~600KB đập vỡ nguyên tắc zero-asset), và tự tắt theoprefers-reduced-motion.
4. Luật NavBar
NavBar là tài nguyên khan hiếm nhất của trang công khai. Hai chỉ đạo liên tiếp rút nó về đúng những gì người chưa có tài khoản cần.
| Bỏ | Vì sao |
|---|---|
| Menu "Trường chuyên" (SRC-562) | Gỡ đúng lối vào trên NavBar; route /specialist-schools và các trang trường vẫn sống — link đã chia sẻ và các trang khác vẫn trỏ tới. Chỉ đạo nói menu, không nói bỏ tính năng (SDD-020). |
| Hai link "Nemos" và "Marlins" (SRC-563) | Hai cửa vào app đứng trên nav bắt người ngoài phải biết trước mình thuộc nhóm nào. Gộp làm một cửa Login. |
| Thêm | Luật |
|---|---|
| Login (SRC-563) | Trang /login chỉ là ngã ba hỏi "Bạn vào Nemo12 với vai nào?" — hai cửa "Tôi là bố mẹ" (→ marlins) và "Con vào học" (→ learn). Không dựng form đăng nhập thứ ba: form sống ở từng cổng, mỗi cổng một Google OAuth client; thêm form nữa là thêm một chỗ phải bảo trì đăng nhập. Login là nút viền (hành động), đứng tách khỏi các mục điều hướng chữ. |
| Dolphins (SRC-563) | Trỏ /mentors. |
Dòng "Đã có tài khoản? Đăng nhập" ở hero cũng trỏ /login thay vì thẳng marlins — trước đó nó ngầm coi mọi người quay lại đều là bố mẹ.
Chốt tại SRC-563: 4 mục — Nemo Programs · Marlin Programs · Dolphins · Login. Bản đang chạy có thêm mục "Cộng đồng" (thêm sau, ngoài phạm vi tài liệu này), tức 5 mục. Nhãn "Nemo Programs / Marlin Programs" đến từ chỉ đạo sau SRC-559, đè lựa chọn "Cho con / Cho bố mẹ".
5. Luật trang Dolphins (mentors)
5.1 Trang riêng, trang chủ chỉ còn lối đi (SRC-560)
/mentors trước đó đổ về trang bố mẹ /cho-bo-me. Nay là trang Dolphins riêng: hero biển + mascot cá heo + câu "Những anh chị đi trước, từng ngồi đúng chỗ con đang ngồi" + câu tin cậy đếm từ dữ liệu + toàn bộ thẻ mentor và cố vấn.
TeamStrip trên trang chủ rút về tối thiểu: tiêu đề + câu tin cậy + một nút "Gặp các Dolphins" — bỏ hẳn lưới 5-6 thẻ mentor. Cùng nguyên tắc §3.4 điều 3 với các gói: chi tiết thuộc về trang danh sách, trang chủ chỉ còn lối đi.
/cho-bo-me giữ nguyên danh sách mentor của nó (REQ-BRD-08 — vùng bố mẹ vẫn cần phần "vì sao tin được"). Nút quay lại của hồ sơ mentor đổi từ /cho-bo-me sang /mentors.
5.2 Thứ tự, headline hai dòng, môn đồng hành (SRC-523)
- Thứ tự hiển thị: Đắc → Phan Quốc Việt → Hồng → Minh Thông → Hồng Hà. Trước đó mọi hồ sơ để
display_ordermặc định 100, nên thứ tự thực tế rơi về bảng chữ cái tiếng Việt củafull_name— đó là thứ tự của máy, còn trang giới thiệu đội ngũ thì gặp ai trước là một lựa chọn biên tập. Đánh số cách nhau 10 để chèn người vào giữa không phải đánh số lại cả bảng. - Headline hai dòng: bẻ tại dấu phẩy đầu tiên (lớp chuyên / trường). Mọi headline theo cùng khuôn "LỚP CHUYÊN, TRƯỜNG" nên chỗ ngắt đó trùng đúng chỗ ý nghĩa đổi; để một dòng thì ở cột hẹp trình duyệt cắt giữa tên trường thành hai mảnh không mảnh nào đọc thành ý.
- Môn đồng hành: Đặng Tuyết Hồng — AI và Ngữ Văn; Phan Quốc Việt — Toán; Hồng Hà — Tiếng Anh và IELTS.
subjects_jsoncũ chép theo lớp chuyên ngày xưa, mà lớp chuyên hồi phổ thông và môn nay họ đồng hành là hai chuyện khác nhau. Mã môn hiển thị bằng tên tiếng Việt, không bày thẳngkoreanhayielts.
5.3 Thẻ rút còn tên + trường, và trang chi tiết phải mở được (SRC-579)
Hai việc trong một chỉ đạo.
Rút gọn thẻ. Thẻ mentor chỉ hiện tên và "Cựu học sinh {trường}" — bỏ dòng lớp chuyên, bỏ thành tích, và bỏ luôn dòng "Đồng hành ở môn" thêm ở SRC-523, theo chữ "chỉ… thôi". Câu dựng từ alumni.school là dữ liệu có cấu trúc, không cắt chuỗi headline viết tự do — nhờ vậy năm thẻ đọc giống hệt nhau. Chi tiết vẫn đủ ở /mentors/{slug}; hai helper headlineHaiDong / cauMon giữ nguyên vì trang hồ sơ và test vẫn dùng.
Sửa lỗi trang trắng. Bấm chi tiết mentor ra trang trắng (DOM 2443 byte, không cả h1): web đọc mentor.links.website mà API production chưa có trường links → TypeError → React bỏ trắng cả trang. Vì sao API chưa có: commit thêm trường bị CI đỏ nên deploy-api không chạy, và các commit sau không đụng workers/api nên path filter không kích hoạt lại.
Luật rút ra, đã ghi trong code: web và api là hai worker deploy riêng, không bao giờ lên cùng lúc. Mọi trường API mới thêm phải đọc qua
?.cho tới khi chắc api đã lên.
5.4 Headline là VAI, tag dưới thẻ là chứng chỉ (SRC-826)
Chỉ đạo chủ dự án 2026-09-18 cho đội IELTS: headline rút về đúng chức danh — NEMO IELTS Program Director (Đắc), Program Auditor (Đặng Tuyết Hồng), IELTS Teacher (Hồng Hà, Phương Anh, Tú Minh). Dòng ấy đứng ngay dưới tên, nên một câu mô tả cách làm việc ở đó biến ba thẻ cạnh nhau thành một khối chữ thay vì ba con người; phần bị rút vẫn còn đủ trong bio.
Mẩu chữ dưới thẻ chuyển sang cột MỚI mentor_profiles.card_tag (migration 0247), không dùng lại current_org: cột đó trả lời "hiện học/làm ở đâu" và trang hồ sơ đầy đủ bày nó dưới nhãn Hiện tại, nên nhét "IELTS 8.0, ex-Chuyên Ngữ" vào đấy là để trang hồ sơ nói sai về người thật, im lặng, ở một chỗ không ai nghĩ mình vừa sửa. Giá trị: Đắc — Thiết kế chương trình NEMO IELTS; Hồng Hà — IELTS 8.0, ex-Chuyên Ngữ; Phương Anh — IELTS Reading 9.0; Tú Minh — IELTS 8.0, ex-Chuyên Sư phạm. Hồ sơ chưa khai card_tag thì thẻ lùi về current_org như cũ, không hở chỗ trống.
Bổ sung 2026-09-18 (SRC-832): Đặng Tuyết Hồng nhận card_tag "Kiểm soát chất lượng, ex-Chuyên Ngữ". Đây là hồ sơ duy nhất còn trống sau đợt trên, nên tất cả thẻ đội IELTS nay đều có tag riêng và không thẻ nào còn lùi về current_org.
Cả headline lẫn tag đều dùng chung cho thẻ ở trang môn và cho trang chi tiết (/…/ielts/mentors, /ielts/team) vì cả ba nơi đọc cùng một hồ sơ — đó là lý do dữ liệu nằm ở D1 chứ không chép vào mã.
5.5 Trang đội ngũ: mở ra mới đọc, và hai mạch tách rời (SRC-833)
Chỉ đạo chủ dự án 2026-09-18, ba việc trong một vòng.
Màn đầu tối giản. /{vai}/university/ielts/mentors bỏ hẳn khối hero cũ (tiêu đề lớn "Ai ngồi cùng bạn mỗi tuần", một câu về mức xác minh, hai nút). Nó chiếm trọn màn hình đầu mà không nói được điều người đọc vào đây để biết: ai dạy. Người đọc tới đây từ trang môn và đã đọc lời mời ở đó, nên lặp lại lời mời trước khi cho xem đội ngũ là bắt họ trả tiền hai lần cho cùng một câu. Thẻ đóng chỉ còn bốn thứ: chữ cái tên, tên, vai, và card_tag. Mọi thứ khác nằm sau một cú bấm vào thẻ, và mỗi lúc chỉ mở một hồ sơ — mở hết cùng lúc là quay lại đúng bức tường chữ vừa bỏ đi.
Hai mạch thông tin tách rời. Phần mở ra chia hai khối có tiêu đề riêng: Tiếng Anh & IELTS đọc mentor_profiles.expertise_bio, Ngoài lớp học đọc personal_bio (migration 0248). Đây là HAI CỘT chứ không phải hai đoạn trong một ô bio: giao diện phải biết câu nào thuộc mạch nào, chứ đoán theo dòng trống thì ngày một người xuống dòng khác đi là trang bày sai mà không có gì đỏ lên. bio giữ nguyên vai trò bản kể liền mạch (trang mentor chung, email); hồ sơ chưa tách thì trang lùi về bio nguyên khối, không gắn tiêu đề — gắn "Tiếng Anh & IELTS" cho một đoạn có cả chuyện cá nhân là nói sai về người thật.
Bỏ nhãn "Đã xác minh trường lớp" ở cả /…/ielts/mentors lẫn /ielts/team. Cờ alumni_verified vẫn còn trong dữ liệu và vẫn là điều kiện publish ở dolphin: bỏ ở đây là bỏ một nhãn trên mặt trang, không phải bỏ việc xác minh.
SEO đi kèm, không tách rời. Ba URL nói về cùng một nhóm người (/students/…/mentors, /parents/…/mentors, /ielts/team) trước đây dùng chung một <title> trong khi canonical khác nhau — ba trang tự cạnh tranh nhau trên cùng một truy vấn. Nay tiêu đề và description tách theo vai. Bản tĩnh (thứ bot đọc) phải khớp bản React: h1 của route đổi theo cùng lúc với tiêu đề trên màn, nếu không thì một URL có hai trang khác nhau tuỳ ai đọc.
6. Trang công khai của chương trình Grammar (SRC-1106, 28.09.2026)
Chủ dự án: để vào đại học, ngoài IELTS và SAT còn chương trình Grammar (ngữ pháp chuyên sâu), dành cho học sinh ôn thi vào lớp 10, thi tốt nghiệp THPT và IELTS. Chương trình thật ở learn.nemo12.com/grammar (PRD-008); các trang dưới đây chỉ giới thiệu.
URL (mỗi vai một bản: /students/… và /parents/…) | Nội dung |
|---|---|
/{vai}/university/grammar | Trang môn: hero, năm level làm năm bước, nút sang learn.nemo12.com/grammar |
/{vai}/university/grammar/who-is-it-for | Ba kỳ thi (thi vào 10, tốt nghiệp THPT, IELTS), mỗi kỳ nên bắt đầu từ level nào |
/{vai}/university/grammar/levels | Năm level Starter A1 tới Advanced C1, 30 mảng, 103 bài |
/{vai}/university/grammar/how-it-works | Năm phần của một bài: video, luật, 3 ví dụ, 3 lỗi hay gặp, 5 bài tự làm mức 1 tới 5 |
- Grammar là một môn
builtcủa mục tiêu Vào đại học, đứng sau IELTS và SAT trên lưới. Thẻ mục tiêu đổi thành "Luyện IELTS, SAT, Grammar" (bố mẹ: "... cho con"). - Mục tiêu Vào cấp 3 không có trang môn Grammar thứ hai: trang Tiếng Anh thi vào 10 dẫn sang đây. Hai trang môn cùng nội dung ở hai mục tiêu là hai URL tự cạnh tranh nhau.
- Chữ UI tiếng Việt; tên level và tên mảng tiếng Anh chỉ làm nhãn. Không nhắc tên giáo trình nào (PRD-008 §2).
- Danh mục có MỘT nguồn (SRC-1242, trả nợ SRC-1106): gói
packages/grammar-catalog(@nemo12/grammar-catalog). learn dựng/grammartừ đó, cònapps/web/src/site/grammarProgram.tssinhGRAMMAR_LEVELStừ cùng file, nên không còn bản chép tay nào phải sửa cùng lượt. Testapps/learn/src/grammar/catalog.test.tsđỏ khi một bài trong danh mục không có file nội dung, hoặc một file nội dung không có dòng trong danh mục. Từ SRC-1125 trang "Học thế nào" ghi cả 103 bài đã có nội dung (PRD-008 §10), thay câu "đang được soạn dần" của vòng đầu.
7. Trang giới thiệu NEMO SPEAK (SRC-1121, 28.09.2026)
Chủ dự án (bài Facebook 28.09.2026): giới thiệu chương trình luyện nói NEMO SPEAK trên nemo12.com. Chương trình thật ở learn.nemo12.com/speak (SRC-1120); trang công khai chỉ giới thiệu và nút đăng ký trỏ thẳng vào đó.
| URL | Nội dung |
|---|---|
/speak | Vấn đề (ngại nói, niềm tin "Mình không giỏi tiếng Anh"), vòng luyện nói, bảy bậc Answer tới Maintain a Conversation, lịch tối thứ Tư 20:00 (Speaking Practice) và sáng Chủ nhật 10:00 (Official Speaking Class), 2 buổi học thử miễn phí, ba mentor |
- Một trang, một URL gốc ngắn, không nhân đôi theo vai: người đọc là học sinh và bố mẹ như nhau.
- Lối vào: chân trang khu IELTS, mục "Đọc tiếp" của trang môn IELTS (hai vai), và bài Speak together.
- Dữ liệu chữ ở
apps/web/src/site/speakProgram.ts, dùng chung cho trang thật và bản tĩnh trongroutes.ts.
8. Lưới ảnh chụp chat của học viên (SRC-1169, 30.09.2026)
Trang /students/ielts, /students/speaking, /students/grammar, /students/sat có khối "Học viên nói gì" (tự ẩn khi chưa có ảnh), và trang tổng /students/testimonials có chip lọc, hiện ảnh chụp tin nhắn Zalo/Zoom của học viên do mentor đăng trên dolphin. Luật đầy đủ: chat-testimonials.md.
Trang chương trình đọc State + Stage của từng khách (lưu ở localStorage, không cần đăng nhập) để chọn khối đứng đầu và nút chính; thí điểm ở /speak. Luật đầy đủ: visitor-state (SRC-1214).
Trace
- §2 giữ nguyên nghĩa REQ-BRD-01 (5 trang school), chỉ đổi dòng phụ hiển thị.
- §3 và §4 là kiến trúc điều hướng của trang gốc REQ-BRD-01; các trang chương trình chưa có REQ riêng (REQ-BRD-04 "pricing page" vẫn ⏳ vì mô hình thu phí chưa chốt — Q-014/Q-015), tài liệu này là canonical tạm thời cho chúng.
- §5 hiện thực REQ-BRD-08 (đội ngũ trên nemo12.com) và không đổi nghĩa REQ-MEN-*; §5.4 thêm trường hiển thị
card_tagvà §5.5 thêmexpertise_bio/personal_bio, không đổi nghĩa REQ nào. - §4 không đổi REQ-BRD-09/SDD-020: các trang trường chuyên còn sống, chỉ mất lối vào trên NavBar.
- §6 (SRC-1106) là trang giới thiệu công khai của PRD-008, không đổi nghĩa REQ nào.
- §7 (SRC-1121) là trang giới thiệu công khai của chương trình SRC-1120, không đổi nghĩa REQ nào.