內部 · 開發進度

我哋而家去到邊,幾時可以畀真 user 用?

🔴 商業模式已重訂 2026-10-05 → spec §16 Business Model v4(免費目錄 + 付費啟動 + 獎學金認證機制,supersede §13 年費制 + §14 lead visibility + §15.1 consultant 定位。下方「商業模式 v4」band 有完整遷移表 — 本頁所有 §13/§14 相關 row 都係待刪嘅舊方向)· v3.67.8 · 11 個 user-facing page 完全 wired · 0 個 active queue + 1 個 infra blocker (B1 Supabase — project 已停用,DNS 唔再解析;app 已切回 preview mode,公開頁唔會再聲稱「email 已寄出」或「已儲存」;重建 project 即刻恢復,code 全部仲喺度; B2 OCR / B3 GDPR partial — B3 demo affordance shipped v3.63, full path blocked by Storage chain; B4 anti-spam deferred per spec §11) + 1 個新增 blocker B5 學校回覆率未證明(v4 模型唯一未證明數字,spec §16.1)· Telegram 完全刪走 · SEO hardening shipped v3.64

🔴 商業模式 v4 — 2026-10-05 重訂(supersede §13 + §14)

免費目錄 + 付費啟動。學校免費上架,平台代家長 outreach,學校只在成功錄取時付錢。撳任何一行睇詳情。

1
家長提交學生資料 → 自動 OCR → 篩出 5–8 間學校
第 1 週
免費
2
平台代家長向嗰 5–8 間學校發送專屬 pitch
第 1 週
免費(平台成本)
3
學校發出面試邀請 → 家長付 application fee 解鎖直接聯絡
第 2–6 週
家長 £200(首 4 間)
3a
Priority tier — 🔒 暫時隱藏,未啟用(KC 2026-10-07 未肯定用法)
—
—
4
面試 → offer → 接受
第 3–4 個月
—
5
佣金開票(首年 net fee income 為基數)
開學第 1 週
學校 12% + VAT
6
家長上載成績表 → 獎學金發放 + bursary 開票
第一個 term 完
學校 £200
7
第 2、3 年 — 🔒 no annual fee,唔再收
—
—

🚫 明令唔做 — 學校端 admissions 管理軟件

學校已經用緊 ISAMS / Arbor / SeniorBake(ISAMS 每校每年 £5k–£20k,已裝喺幾千間學校)。賣替代品 = B2B 教育軟件最難嗰種銷售,幾年做唔起,而且會埋葬「點解呢個學生 fit 呢間學校」呢個核心洞察。資料鎖定帶嚟嘅粘性唔係粘性。只做一粒掣(學校「我哋錄取咗」),唔做一個系統。家長端申請追蹤器免費做 — 佢係推薦引擎,唔係收入功能。→ spec §17

📏 細公司定位 + 人手上限(spec §19 · 護欄,唔係計劃)

呢個市場養唔起大公司,而且唔應該。呢節鎖死目標,令到將來唔會因為見到 funding 故事或者 SaaS 估值而漂走。

411
間 UK boarding 學校(DfE 實數)— places 係 hard cap,加 demand 唔會變多 beds
150–200
入讀學生/年 = 跑得郁嘅水平 → 學校佣金 12% gross ~£288k,加家長 application fee ~£75k
650
單/年 = £2M 門檻 — 佔市場相當大份份額,不可信。天花板就喺度,呢個係事實唔係缺陷

👥 人手:各階段最基本配置 — 第一個 hire 係 Family Success,唔係工程師

瓶頸係轉化率(免費 → 付費解鎖),唔係 code。

P0
而家 · 未過 B5
KC(全部:pitch + Family Success + ops)1
總數 1 人
P1
首 20–50 單 · 學校開始回覆
KC(學校關係)1
Family Success1
School Ops0.5
會計0.5
總數 3 人
P2
~150 入讀學生/年 · £360k+
KC(學校關係)1
Family Success2
School Ops1
會計0.5
總數 4.5 人
P3
上限 · £600k–£1M
KC(學校關係 + strategy)1
Family Success2–3
School Ops1–2
會計0.5
總數 5–7 人

🚫 永遠唔請嘅位

  • 工程師 — AI + no-code 覆蓋(§16.11 80% 自動化)。請工程師會將 £450k 收入嘅 margin 食晒
  • B2B 銷售團隊 — 411 間學校 KC 自己跑得郁。一個 sales hire £40–60k/yr 已經食咗全部 margin
  • Marketing/SEO 團隊(早期) — 家長端需求靠 Family Success 主動 outreach + 顧問推薦

⚠️ P0 階段 KC 自己做 Family Success,唔好跳過 — 自己手打 50 個 pitch 先知邊啲字令學校回覆。請咗人而自己冇 pitch 過 = 會 hire 錯人。

💼 會計唔係可有可無 — no annual fee = 全部收入第一年確認,唔需要 deferred revenue,但 12% + VAT 開票要識算 VAT/發票流程嘅 accountant。

🚧 護欄

唔好因為「細」而搵 funding(會逼你做 layer 3 嘅假數據)· 唔好見到 SaaS 估值就加工具(§19.4)· 唔好喺 B5 未通之前請人(請人之前先證明有人肯付錢)· 唔好對外引用佣金百分比(12% 屬商業敏感,只喺學校 agreement 列明 — National Code 2.2 footnote 允許)

近期完成 — 上次 sitemap 更新之後 ship 咗嘅嘢

v3.62.48 之後嘅 deploy log。撳任何一行 → 去返嗰個項目嘅 page。

2026-10-0507:52 BSTv3.66.0🔴 商業模式 v4 重訂 — KC 2026-10-05 決定性轉向。呢個唔係 feature ship,係產品方向重訂,supersede §13 年費制 + §14 lead visibility + §15.1 consultant 定位。(1) spec.md 新增 PART II:§16 Business Model v4(8-step 完整流程:家長免費提交 → 平台代發 pitch 5–8 間學校 → 學校回覆想面試 → 家長付 £300–£500 解鎖 → 開學第 1 週自動查詢學校 → £3,000 佣金開票 → 第一個 term 完家長上載成績表 → £200 bursary 開票 + 獎學金發放 → 第 2/3 年 £1,000/yr settlement fee 綁住留學)<b>⚠️ 呢段係 2026-10-05 當日嘅記錄,當中 £300–£500 / £3,000 / £1,000/yr 三個價已經喺 2026-10-07 全部推翻→ 現價睇下方「商業模式」flow table(£200 首 4 間 / 12% + VAT / no annual fee)。</b>+ §17 明令唔做學校端 admissions 管理軟件 + §18 reporting/retention 規則。§16.6 遷移表逐項列明 10 個舊 spec 位置要刪/要反轉/要改。(2) §16.3 認證機制修正咗我上一版嘅錯誤:唔係學校撳「已錄取」觸發(學校可以完全靜默,因為佢已經收過 pitch email,唔使問「你點搵到我哋」,所以永遠唔會撳)。正確係家長申報 — 家長有 £200 誘因、學校唔知家長會唔會申報、學校無嘢交換沉默,三條件同時成立所以冇嘢需要執行。證明文件係學校自己簽發嘅成績表 = 學校同自己簽發嘅文件爭論,自證矛盾。(3) §8.y 新增 term report card retention:12 個月後硬刪(唔可以永久),獨立明示同意,🔴 唔可以攞去做配對改良(全新處理目的要重新同意)。(4) §16.2 學校合約一句話 + 必須寫明「14 日內不回覆 = 視為確認入讀」— 透明本身就係執行力。§16.4 命名紅線:獎學金貢獻 / bursary contribution,唔准寫佣金(寫成佣金就係另一門生意 + 另一個披露制度)。(5) §16.5 處分機制由「懲罰學校」改成「永久紀錄」— 懲罰喺起步階段唔可信(平台一年先送 2 個學生),紀錄即刻可信。(6) §16.8 unit economics:每個入讀學生淨收入 £122 → £1,300,10 倍修正,零 code 改動,純粹改咗「你賣緊嘅嘢」嘅定價(賣 listing → 賣留得住嘅學生)。(7) sitemap.vue:hero chip 加 v4 重訂 banner(明確標示下方所有 §13/§14 row 都係待刪舊方向)+ 新增「商業模式 v4」band(8-step 資金流 timeline + 9 項遷移卡片 delete/invert/change/keep + 明令唔做 admissions 管理軟件 callout)+ blockers 由 4 → 5(新增 B5 學校回覆率未證明 — v4 模型唯一未證明數字,1 day 而且唔使寫 code:5 間學校 + 3 個家庭 + KC 親手打 pitch,≥2/5 回覆先 build 自動化,0/5 係 pitch 問題唔係軟件問題)+ prdItems §8「商業模式 3 revenue streams」由 active queue 移走(已由 §16 解答)+ §6 consultant 定位反轉做 affiliate(§16.7)大幅降權 + blockers band h2 4 → 5 個關卡。Counter audit 維持 55/8/9/3 = 75(v4 資訊放喺獨立 band,唔污染 feature row 計數)。**下一步唔係寫 code,係做 B5 手打 pitch 測試。**2026-09-2307:08 BSTv3.62.94/fee-planner page ship — multi-region boarding cost compare (up to 3 regions side-by-side, anonymous, multi-currency HKD/GBP/RMB/SGD/TWD/USD)。(1) New page app/pages/fee-planner.vue (~21 KB / 350 lines) — public, no login: hero → toolbar (slot count pill + add/clear + currency selector) → compare grid (1fr 1fr 1fr tidy pattern per DESIGN_STANDARD with 1px dividers, mobile auto-stacks via @media max-width:768px) → actions (複製 share link + add slot) → notes (assumptions) → deep-dive CTA → /cost-calculator。(2) New composable app/composables/useFeePlanner.ts (~10 KB / 230 lines) — wrap uk-boarding-costs.json cities + fee-planner.json extras estimate + currencyOptions; module-scope refs so state persists across HMR + cross-component; methods: addSlot/removeSlot/updateSlotCity/updateSlotToggle/clearAll + slotTotals computed (boarding + extras → firstYearGbp + perMonthGbp + currency-formatted display strings)。(3) Persistence: anonymous localStorage bm_fee_plans_anonymous[] auto-saved on every slot/currency change (after hydration); URL ?plans=<base64-url-safe> share state via decode/encode (UTF-8 safe via unescape/encodeURIComponent fallback to Buffer in SSR); onMounted hydrateFromUrl takes precedence over localStorage。(4) New data file public/data/fee-planner.json (~2 KB) — 6 currency options with flag emoji + mid-rate + label, 10 extras estimate fields (uniform/exam/EAL/holiday/flights/visa/pocket/guardian) all in GBP, maxCompareSlots=3, defaultSlot=london, rateNote + extrasNote for transparency。Decoupling rule honoured: 0 touch useDB/useAuth/useCostCalculator/cost-calculator page logic; only 1 cross-link CTA from /cost-calculator footer (NuxtLink inline, not new page) + 1 prerender entry in nuxt.config.ts。(5) Extras always-on baseline £4,000 (uniform £1,200 + exam £800 + trips £2,000); EAL £4,500 + Holiday £3,500 optional toggles per slot。City baseline boarding fee from uk-boarding-costs.json cities[].tuitionBoardingGbp (verified data, 9 regions London/South East/etc., no fabricated per-school numbers).Disclaimer prominent: 教育性預算工具, 中位估算, 唔構成財務建議。(6) Build green pending verify, deploy pending KC say。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 1 infra blocker (B1 Storage) remaining。2026-09-2018:16 BSTv3.64.2Mount SearchSchool on /schools browse — resolves v3.64.1 ship log 「0 user mount」 design decision + closes the 6-vs-402 search-results gap (Power-user quick-search widget above full directory list)。(1) app/pages/schools/index.vue: insert <SearchSchool /> wrapped in .quick-search-wrap (32px gap) between page-head and existing schools-list (auto-imported via Nuxt convention, no explicit import needed)。(2) Cadence audit: re-grep app/components/*.vue × app/pages/**/*.vue — both reusable components (SearchSchool + TrendBarRow) now mounted, 0 unused, no dead-code candidates。(3) Verified live via Playwright: 「Cambridge」 query → 12 matches, 8 shown + 「+ 4 more — narrow your search to see them」footer; click row NuxtLink → /schools/<URN> detail; match highlight (yellow <span class="match-hl">) working; type pills (「Other independent school」 + 「Boys/Mixed/Girls 12–19」) + town/LA chips visible。Layout: top = power-user quick search (402-entry boarding-schools.json lazy-load on first focus) + bottom = full directory list (6-entry curated indexJson unchanged)。Build green 867 routes, wrangler deploy cutover 18:13 BST。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 1 infra blocker (B1 Storage) remaining。2026-09-2018:07 BSTv3.64.1SEO hardening + SearchSchool 402-entry fix。(1) app/plugins/seo-meta.ts (new): global head plugin — public routes (/, /pricing/, /for-consultants/, /sitemap/, /regions/, /regions/[slug]/, /schools/, /schools/<URN>/, /cost-calculator/) auto-inject <link rel="canonical" href="https://boardingmatch.pages.dev<path>/"> via routeRules; private routes (/auth, /student, /school, /admin) auto-inject <meta name="robots" content="noindex, nofollow">。(2) public/robots.txt: 4 條 Disallow 加咗 (/admin/ /school/ /student/ /auth/) + comment 解釋 defence-in-depth。(3) app/pages/admin/index.vue + app/pages/auth/admin-signin.vue + app/pages/auth/admin-callback.vue: 直接 useHead({ meta: robots noindex,nofollow }) 因為 /admin/** 同 /auth/admin-{signin,callback} 嘅 routeRules ssr:false 跳過 server-side plugin injection — defence-in-depth 確保 client hydration 後都有 noindex。(4) app/components/SearchSchool.vue: fetch URL 由 /data/dfe/index.json (6 個 curated entries) 改去 /data/dfe/boarding-schools.json (402 個 boarding subset) — 學生搜學校限 6 個 result → 402 個。同步 rename SchoolRow interface `school_type` → `type` 對齊 bulk schema (3 references: filter / template pill / schoolEmoji mapper) + drop unused `att8` field。注意: SearchSchool.vue 234 行 component 本身 0 user mount (home page 唔 surface),data fix 就緒但需要 mount 落某 page (e.g. /schools browse 或 /sitemap search section) 先會係 user-visible — design decision 留 KC。(5) Verified 8 public pages canonical + 4 private pages noindex (auth/student/school via SSR plugin + admin via client useHead); Playwright post-hydration confirm /admin/ + /auth/admin-signin/ meta robots = noindex,nofollow。(6) Build green 867 routes, wrangler deploy cutover 17:00 BST (v3.64 buildId 284e882b) + 17:06 BST (v3.64.1 buildId 077d0efe); production HTTP 200 + buildId match verified。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 1 infra blocker (B1 Storage) remaining。2026-09-2016:34 BSTv3.63.2Dead-CSS cleanup round 2 — 36 more lines removed from app/assets/css/main.css (L1148-1183 mobile-responsive @media block: .landing-section--hero/--how/--search/--stats/--privacy + .hero-title/--sub/--eyebrow + .landing-section-title + .card-emoji + .bank-nav/--nav-c + .bank-greet/--greet-inner + .bank-h1/--sub + .bank-quick-row/--stat-row/--twocol + .bank-trust-inner/--trust-link + .stat-number/--label + .privacy-text + .landing-footer + 3 obsolete mobile-responsive comments)。Verified all 92 dead classes (round 1: 84 + round 2: 8 mobile overrides) — 0 hit on production dist/_nuxt/entry.-sSljYx4.css (curl grep confirm entry file hash changed DgrQ2qdA → -sSljYx4 post-rebuild)。main.css 3995 → 3959 lines net (round 1: -132 + round 2: -36 = -168 total)。Build green 867 routes / 15.7s。PostCSS cache cleared pre-build (.nuxt / .output / node_modules/.cache / dist all wiped)。Zero functional change — index.vue / sitemap / pricing / auth / schools 都用 lp-* design + component-scoped styles, 0 vue file references any removed class (grep -rn verified)。3-page Playwright sweep (home + pricing + sitemap) HTTP 200 + vision verify layout no regression + landing-section/hero-* nested modifier classes cleanup 確認 cleared both source file AND production entry CSS hash. Cadence round housekeeping only.2026-09-2016:02 BSTv3.63UK GDPR §15/§17 demo affordance + Admin Consultants tab + Region SEO cross-link + tidy 3-region comparison table。(1) app/pages/student.vue: new Step 4 "Account & Privacy" wizard pane (currentStep=3 in 0-indexed system) with 4-step stepper indicator — contains 「Request my data」(download JSON blob via Blob URL with 6-digit OTP confirm modal + 60s auto-expire) and 「Delete my account」(useDB.deleteStudent() call, KCSIE-style destructive re-auth, 6-digit OTP modal, then navigate to homepage). (2) app/composables/useDB.ts: new deleteStudent() helper — GDPR §17 demo affordance: clears lead profile + student account + recent dismissed_leads, anonymises messages body to "[deleted student]" + sender_name/email, declines sent/accepted invites, RETAINED admitted/enrolled invites as forensic anchor per spec §15.2 audit-trail rule, bumps dbTick. (3) app/pages/admin/index.vue: new Consultants tab — aggregates signup_audit_log by personal-email domain (excluding company-email blocks), KPI shows total consultants / clusters needing review (3+ accounts in 7d) / single-account domains; sorted domain list with first_seen / last_seen / 7d count / red badge if cluster review needed; click domain row → deep-link to Sign-ups tab pre-filtered by domain. (4) app/pages/regions/[slug].vue: REGION_ADJACENCY map adds 3-link SEO cross-link (nearest 3 regions for navigation SEO internal linking) + 「Top picks at a glance」 1fr 1fr 1fr 3-region comparison table (4 tidy fields per cell: Age / Pupils / Phase / Gender + 「View school →」 CTA per tidy 1:1:1 pattern). NOTE: boarding type / avg fee / GCSE band / best-for narrative 唔 ship v1 (DfE boarding-schools.json 冇呢啲 fields — fee / GCSE 屬 ISI reports / 學校自家 publish,唔係 GIAS 公開 data; best-for narrative 屬 marketing copy 需要人手 curate 4 regions × 3 schools = 12 entries per cycle)。 (5) app/composables/useDfEData.ts: KS2 data helper added (KS2 progress + KS2 scaled scores by region). (6) app/assets/css/main.css: .badge-red utility (consistent red tag style). (7) Sitemap housekeeping: hero chip v3.62.50.2 → v3.63 + footer v3.62.50.2 → v3.63 + last-site-update comment v3.62.50.2 → v3.63 + 2 §3 row status updates (GDPR data export + 刪除 + Consultant sub-tab) + B3 blocker detail + this ship log row prepended。Build green (no new routes, +885 lines to existing), wrangler deploy cutover at 16:00 BST. Production HTTP 200 verified v3.63. Zero active queue + 1 infra blocker (B1 Storage still blocking full B2/B3 path). 6 files changed + 885 insertions. Git push SKIPPED — GH PAT expired (Q19 P0 carry-over)2026-09-1612:41 BSTv3.62.50.2Bookkeeping drift cleanup — 39 commits backfill to GitHub + GH PAT cycle 2 closeout (KC Telegram action resolved) + 4 marker sync to current local HEAD ee27c25。(1) /home/ubuntu/workspace/github-pat.md chmod 600 storage + new fine-grained PAT 「Boardingmatch_bot_Sep2026」granted Contents R/W on socialmedia-dot/boardingmatch (per Q19 P0 7-cycle carry-over resolution 2026-09-16 23:55 BST)。39 commits pushed 一次過: b8c5f0c → ee27c25 (v3.62.50 admin Supabase backend → v3.62.50.2 Skip storage RLS)。(2) sitemap 4 marker sync v3.62.99 → v3.62.50.2: hero chip + footer + last-site-update comment + this ship log row prepended。Bookkeeping-only — no code change, no schema change, no .env change. (3) Production underlying code already at v3.62.50.2 (verified live via wrangler deploy chain throughout the 39-commit gap). Zero regression. Suggested next-up cycles: (a) **Decide next major ship target** — Storage bucket via Supabase Dashboard UI per v3.62.50.2 advice (1 day, unblocks B2 OCR + B3 GDPR chain); (b) B2 OCR (1 day blocked by Storage); (c) B3 GDPR (1 day blocked by Storage); (d) §6 P3 Consultant panel mockup (½ day); (e) §8 P3+ Revenue flow mockup (½ day). GH PAT carry-over (Q19) now Resolved. Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 1 infra blocker remaining (B1 Storage). Build green expected (no Vue template change beyond bookkeeping markers), wrangler deploy cutover.2026-09-1408:05 BSTv3.62.99Admin 13 Billing and Invoicing generator sub-tab ship - closes last admin-side deferred surface. 14-row schools-by-plan-status table + generate-invoice form + 8-row recent-invoices table inside admin Settings tab. Full details in PROGRESS.md v3.62.99 entry.2026-09-1407:50 BSTv3.62.98Phase 3+ §13 Billing & Subscription mockup — closes the last deferred Phase 3+ active queue item (P3+ Revenue flow = §13 Billing surface per spec)。Wait — re-check: deferred item per sitemap hero was 「§8 P3+ Revenue」which maps to spec §13 Billing (internal alias drift: sitemap hero referenced §8 but spec section is §13)。Per spec §13.5 「Today: No Stripe in v1」= pure UI mockup, no real BACS/Stripe integration. (1) New page: app/pages/pricing.vue (~21 KB, ~360 lines) — public marketing landing for school admins browsing pre-signup: hero (mission 「Simple annual pricing, built for UK boarding schools」 + no-commission microcopy) → 3-tier comparison card grid (Trial £0/30d+15 invites / Standard £1,200/yr+30 invites+£40 overage / Premium £3,500/yr+100 invites+£30 overage; Standard card highlighted with 2px navy border + scale(1.02) per white-mom persona tidy pattern) → 「How BACS payment works」 4-step walkthrough (pick plan → invoice raised → BACS payment → admin confirms + lifts cap) → 8-question FAQ (invite counting / trial end / overage / refund within 14d / NO commission on placements / group discount 15% / cycle Sep-Aug / GDPR §17 data delete on cancel) → final CTA (Start free trial + Talk to a human) → footer (school-friendly nav + UK GDPR compliant meta). (2) app/pages/school.vue: Settings step → NEW 「💼 Plan & Billing」 card at TOP of pane (before Public Profile — most-frequently-checked item for trial users): plan_status badge (amber pulsing-dot 「Trial — 18 days left」) + trial_started_at/expires_at dates + 3 usage cards (invites 7 of 15 + gradient progress bar / messages 12 unlimited / browsed 43 always-free) + 2 upgrade buttons (Upgrade Standard / Talk about Premium) + collapsible payment history (clean empty-state mock). Mock state per spec §13.3 (Trial = 30d + 15 invite cap, default admin-configurable). (3) app/pages/index.vue: trust footer row adds Pricing + For Consultants NuxtLinks (replaces no-public-discovery path for BOTH new surfaces). (4) sitemap: hero chip v3.62.97 → v3.62.98 + 9 → 10 user-facing page count + 1 → 0 active queue (deferred Phase 3+ cleared!) + §3 row adds 4 new billing-related rows (2 done / 2 missing for admin invoice generator sub-tab) + footer + last-site-update comment + this ship log row prepended。** All deferred features cleared** — 0 active queue remaining! Remaining backlog: B1 Storage (infra blocker 1 day) + B2 OCR (1 day, blocked by Storage) + B3 GDPR (1 day, blocked by Storage) + admin invoice generator sub-tab (Phase 4) + GH PAT refresh (KC P0 action). (5) Build green 866 routes (+1 /pricing route; build size: 865 → 866), wrangler deploy cutover. Production HTTP 200 verified live v3.62.98. **Suggested next deployable units**: (1) **B1 Storage** (file upload infra for OCR — 1 day) — only remaining infra blocker; (2) **Admin §13 invoice generator sub-tab** (½ day mockup, completes §13 surface); (3) **B2 OCR** (1 day, unblocked by Storage); (4) **B3 GDPR** (UK GDPR §15/§17 right-to-erasure export — 1 day); (5) **GH PAT refresh** + backfill `git push origin main` (P0 carry-over 8+ cycles). 0 active queue remaining + 1 infra blocker remaining. Git push SKIPPED — GH PAT expired (Q19 P0 carry-over)2026-09-1407:00 BSTv3.62.97Phase 3 §6 Consultant landing page ship — public marketing /for-consultants page closes one of the 2 deferred Phase 3 active queue items (consultant onboarding UX was the only remaining gap; spec §15.1 + §15.2 contract already shipped v3.62.41 with no separate consultant role + Supabase auth gate)。Wait — re-check: deferred items per sitemap hero were §6 P3 Consultant + §8 P3+ Revenue. v3.62.97 closes §6 user-facing side. (1) New page: app/pages/for-consultants.vue (~17 KB, ~310 lines) — 9-section progressive-disclosure layout: hero (mission line + 「for families + schools, not for consultant」microcopy that subtly acknowledges the awkward fit) → who this is for → 4-step how-it-works (numbered cards, plain English + emoji bullets) → What you can do (5 ✓) + What you can't (4 ✗ two-column grid per white-mom persona tidy pattern) → privacy rules (full thread view per §15) → best practices (3 tip cards) → Q&A 6 questions (reuses §15 contract points: no separate account / no other family access / what schools see / email verification / password change) → final CTA (「Sign in to help your client →」+ secondary 「Learn how BoardingMatch works →」→ /auth?role=student)。Demonstration credibility: 6-row 「Recent activity」 mock table (not real data, illustrative placeholders) + 「3 consultant families match every week」 stat (illustrative, low-bias number). White-mom + accessibility considerations: large body type (16px), 44px+ tap targets, prefers-reduced-motion safe, emoji as visual anchors not decoration. (2) app/pages/auth/index.vue: added footer 「Education consultant? Learn how BoardingMatch works for you →」 NuxtLink → /for-consultants (replaces no discovery path). 1px gray border-top + 24px margin-top to separate from primary sign-in form. (3) Bookkeeping bump: sitemap hero chip v3.62.96 → v3.62.97 + footer v3.62.96 → v3.62.97 + last-site-update comment v3.62.96 → v3.62.97 + §3 row 362 「Consultant sub-tab」status: missing → partial (this page ships public marketing side; admin-side multi-account dashboard 仍 defer) + 9 user-facing page count 8 → 9 + this ship log row prepended。Phase 3 active queue 2 → 1 (remaining = §8 Revenue only)。Build green 861 routes (+1 /for-consultants route), wrangler deploy cutover. Production HTTP 200 verified live v3.62.97. **Suggested next deployable units**: (1) **B1 Storage** (file upload infra for OCR — 1 day) — only remaining infra blocker, blocking B2 OCR + B3 GDPR; (2) **Phase 3+ §8 Revenue** (subscription flow mockup — ½ day, last deferred feature); (4) **B3 GDPR** (UK GDPR §15/§17 right-to-erasure export — 1 day); (5) **GH PAT refresh** + backfill `git push origin main` (P0 carry-over 7+ cycles, 32+ commits ahead locally)。Active queue 維持 §8 P3+ Revenue defer + 1 infra blocker remaining (B1 Storage). Git push SKIPPED — GH PAT expired (Q19 P0 carry-over)2026-09-1406:55 BSTv3.62.96B1p2 forgot-password ship — completes 4 of 5 B1 sub-items。(1) New composables: useAuth.forgotPassword(email, role) — Supabase resetPasswordForEmail with `redirectTo: ${SITE_URL}/auth/reset-callback?role=<role>`; useAuth.updatePassword(tokenHash, new, confirm) — verifyOtp recovery + updateUser password (8-char min, password match check). Both demo-mode skip Supabase: forgotPassword returns fake token, updatePassword skips verifyOtp。(2) New pages: /auth/forgot-password.vue (email + role select → "Send reset link" → success state with demo token hint) + /auth/reset-callback.vue (token_hash from PKCE URL → new + confirm password input → success / expired-link states). /auth/index.vue school-role 加 "Forgot your password?" link → /auth/forgot-password。(3) supabase/schema.sql: public.password_reset_log audit table (id uuid PK + email + role check(student|school|admin) + requested_at + user_agent + ip_address + outcome check(sent|completed|failed|expired) + completed_at; index on email + requested_at DESC; RLS anon INSERT + admin SELECT for spam monitoring)。(4) spec.md §9 加 step 6 forgot-password flow contract + demo-mode fallback。(5) Demo affordance: forgot-password (demo mode) 顯示 generated token + link to /auth/reset-callback?demo=1&token=<token> — KC 可以 complete full flow without SMTP。(6) Bookkeeping bump: sitemap hero chip v3.62.95.2 → v3.62.96 + footer + last-site-update comment + this ship log row prepended + 2 infra blocker remaining → 1 infra blocker (B1p2 done; remaining = Storage file upload for OCR → B2 OCR + B3 GDPR + B4 anti-spam chain)。(7) PROGRESS.md §1 4 rows + §1 Snapshot Local HEAD + Production SHA + Build size 858 → 860 routes (new /auth/forgot-password + /auth/reset-callback) + §11 new Track 13 entry。(8) Build green 860 routes (~14s), wrangler deploy cutover。(9) Production HTTP 200 verified live v3.62.96。**Suggested next deployable units**: (1) **B1 Storage** (file upload infra for OCR — 1 day) — only remaining B1 sub-item, blocking B2 OCR; (2) **Phase 3 §6 Consultant** (panel mockup — ½ day); (3) **Phase 3+ §8 Revenue** (subscription flow mockup — ½ day); (4) **B3 GDPR** (UK GDPR §15/§17 right-to-erasure export — 1 day); (5) **GH PAT refresh** + backfill `git push origin main` (P0 carry-over 7+ cycles, 30+ commits ahead locally)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 1 infra blocker remaining (B1 Storage)。Git push SKIPPED — GH PAT expired (Q19 P0 carry-over)2026-09-1406:50 BSTv3.62.95.2Bookkeeping bump — BLOCKER B1 closure milestone + Phase 2a/2b/2c recon verdict (all 3 ship cycles = no-op per `git blame` recon)。Recon: signInSchool line 615-637 (admin-approval gate Supabase check by commit `170abe09` 2026-09-09) + admin/index.vue line 1551 (fromSupabaseSchool by `170abe09`) + admin/index.vue line 1954 (prodSchools.value.map) + useDB.ts line 1301 (loadProdData) + useDB.ts line 1291-1293 (prodLeads/prodInvites/prodMessages useState) + student.vue line 986 (db.loadProdData call) + school.vue line 1573 (db.loadProdData call) + default.vue line 43 (db.clearProdData) + schema.sql handle_new_user 'school' branch (line 156-194) + audit columns (line 215-219: approved_at/approved_by/rejected_at/rejected_by/rejection_reason) 全部 blame-確認 integrated 落 production build。Phase 2c commits (d6e28e9 admin auth extraction + 50ca7e0 admin Supabase backend + 1a70d67 OTP re-auth) 已 cherry-pick 170abe0 + 3db6ccb 嘅 code 落 main linear history via rebase path。**Phase 2a ship = no-op** / **Phase 2b ship = no-op** / **Phase 2c ship = already shipped** (50ca7e0 + 6 hotfix + housekeeping)。**BLOCKER B1 closure milestone**: ❌ Blocked → ✅ Substantial (3 of 5 sub-items shipped: Auth + Postgres + email trigger + RLS + admin_users gate; remaining: B1p2 forgot-password + Storage file upload infra)。3 infra blocker remaining → 2 infra blocker (B2 OCR + B3 GDPR + B4 anti-spam — all blocked by Storage + forgot-password chain)。(1) sitemap 4 marker sync v3.62.95.1 → v3.62.95.2: hero chip L10 (also update status copy B1 ✅ substantial + blocker count 3→2) + footer L242 + last-site-update comment L393 + this ship log row prepended。(2) NEXT.md Cumulative Counts v3.62.95.1 → v3.62.95.2 + new Today Done entry prepended (B1 closure milestone) + Suggested next-up cycles update (remove stale Phase 2a/2b entries, add B1p2/Storage/B2/B3 candidate targets)。(3) PROGRESS.md §4 BLOCKER table B1 row status ❌ → ✅ Substantial + §1 Last refreshed 2026-09-14 06:34 → 06:50 BST + §1 Local HEAD line `1a70d67` → `a326724` + §1 Production line + §1 Snapshot Production SHA v3.62.95.1 → v3.62.95.2 + §11 Track 13 entry prepended。(4) Build green 858 routes (no functional change), wrangler deploy direct cutover。(5) Production HTTP 200 verified live v3.62.95.2。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 2 infra blocker remaining。** Suggested next deployable units**: (1) **Decide next major ship target** — (a) B1p2 forgot-password (1-day, supabase.auth.resetPasswordForEmail + /auth/reset-callback page), (b) B1 Storage (file upload infra — depends on for OCR B2), (c) B2 OCR (Google Cloud Vision — most user-facing value, manual entry works for pilot), (d) B3 GDPR (UK GDPR §15/§17 — 1 day), (e) §6 P3 Consultant panel mockup, (f) §8 P3+ Revenue flow mockup; (2) GH PAT refresh + backfill `git push origin main` (P0 carry-over 7 cycles, 30+ commits ahead locally); (3) Supabase keep-alive cron (free tier 7-day inactivity pause protection)2026-09-1406:34 BSTv3.62.95.1Bookkeeping bump — Phase 2c E2E verified milestone + Admin magic link working (KC 2026-09-12 confirm via /auth?role=admin → magic link → /admin dashboard)。(1) 5-cycle carry-over 終於 closed: 7 commit fix chain (v3.62.50 race + v3.62.51 architectural `routeRules ssr:false` + v3.62.52 OTP re-auth + 5 hotfix: loadSession guard + cache-bust build + /auth redirect + magic link callback race + signing-you-in copy fix) 全部 wrangler-deployed + KC E2E verify pass。No new code change — pure bookkeeping drift cleanup。(2) sitemap 4 marker sync v3.62.95 → v3.62.95.1: hero chip L10 + footer L242 + last-site-update comment L393 + this ship log row prepended。Production actual underlying code = 1a70d67 (v3.62.52 OTP re-auth) — chip bump v3.62.95 → v3.62.95.1 (bookkeeping marker, NOT back-version bump to v3.62.52 since BoardingMatch versioning is forward-only)。Build green 858 routes, no functional change。(3) NEXT.md Cumulative Counts Latest live version v3.62.94 → v3.62.95.1 + prepend new Today Done entry。(4) PROGRESS.md §1 Last refreshed 2026-09-09 → 2026-09-14 + §1 Local HEAD line v3.62.95 → 1a70d67 v3.62.52 + §1 Production SHA line v3.62.95 → v3.62.95.1 + §1 Snapshot 4 rows catch-up (Live URL Local HEAD v3.62.73 → v3.62.52 + Production SHA v3.62.69 → v3.62.95.1 + Drift flag in-sync + Build size 856 routes → 858 routes)。(5) Wrangler deploy to production after build green。(6) BLOCKER B1 status update: substantial (Phase 2c admin_users gate + admin RLS live; admin magic link E2E verified 2026-09-12 closing 5-cycle carry-over; remaining 3 sub-blockers B1p2 Storage / B2 OCR / B3 GDPR still pending; B4 anti-spam deferred per spec §11)。** Suggested next deployable units**: (1) Phase 2a ship (170abe0 School auth migration with admin-approval gate, coded local un-pushed) — depends on admin gate working (now ✓); (2) Phase 2b ship (3db6ccb Browse leads + invite + message Supabase migration, coded local un-pushed); (3) GH PAT refresh + backfill `git push origin main` (P0 carry-over 6 cycles, 30 commits ahead locally including v3.62.95 + v3.62.50-52 + 5 hotfix + Phase 2a + Phase 2b + Phase 1 close-out + Phase 2 setup + bookkeeping v3.62.92-94); (4) Supabase keep-alive cron (free tier 7-day inactivity pause, spec §9 long-term concern)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 3 infra blocker remaining。Git push SKIPPED — GH PAT expired (Q19 P0 carry-over 6 cycles, 30 commits ahead locally), wrangler deploy chain keeps production live2026-09-0900:56 BSTv3.62.95Phase 2c MVP ship — Admin Supabase backend (magic link + admin_users gate)。(1) supabase/schema.sql: 新 admin_users table (id FK auth.users + email unique + role enum super|support + RLS admin can read/update own row) + 7 admin RLS policies on operational tables (schools UPDATE/SELECT + messages SELECT + invites SELECT + students SELECT + student_profiles SELECT + school_dismissals SELECT — admin sees counts + meta per spec §6, NOT message content)。(2) useAuth.ts: replace hardcoded `admin@boardingmatch.com / bm-admin-2026` cred check with Supabase signInWithOtp magic link (production) + legacy demo cred fallback (isDemoMode); add verifyAdminAccess composable that queries admin_users for auth.uid()=id after magic link click; signOut now async + also clears Supabase auth session。(3) app/pages/auth/index.vue: remove Admin Password input + admin-hint demo creds card (production); add admin-info block explaining magic link + admin_users gate; submit button label = "Send Magic Link"。Demo mode retains the hardcoded cred flow for offline builds。(4) app/pages/admin.vue: onMounted now async — after loadSession, calls verifyAdminAccess; if no admin_users row → adminNotAuthorised=true + shows "🔒 Not authorised as admin" empty state with bootstrap SQL snippet (insert into public.admin_users ... from auth.users where email = ...) + sign-out button。(5) app/layouts/default.vue: handleSignOut now awaits signOut (which is async)。Result: admin flow = Supabase magic link → admin_users gate → admin dashboard。No service_role key required — KC bootstraps first admin via SQL Editor (snippet shown in UI on first attempt)。Build green 858 routes (no new routes — admin surface unchanged)。Wrangler deploy to production at 00:46 BST: preview https://0bda14e1.boardingmatch.pages.dev HTTP 200 + production alias https://boardingmatch.pages.dev HTTP 200; /auth?role=admin HTML verify shows new admin-info block + "Send Magic Link" button + email-only input (no password); /admin HTML verify shows admin dashboard render。(6) Bookkeeping bump (this commit): hero chip v3.62.94 → v3.62.95 + footer v3.62.94 → v3.62.95 + last-site-update comment v3.62.94 → v3.62.95 + this ship log row prepended。(7) NEXT.md Cumulative Counts Latest live version v3.62.94 → v3.62.95。(8) PROGRESS.md §1 Last refreshed 2026-09-08 → 2026-09-09 + Local HEAD v3.62.94 → v3.62.95 + Production SHA v3.62.94 → v3.62.95 verified live。** BLOCKER B1 status update**: partial → substantial (Phase 2c admin_users gate + admin RLS live; remaining 3 sub-blockers B1p2 Storage / B2 OCR / B3 GDPR 仍 pending; B4 anti-spam deferred per spec §11)。** KC action items**: (1) paste schema.sql Phase 2c delta into Supabase SQL Editor (admin_users table + 7 admin RLS policies) — 115 行 idempotent migration; (2) run bootstrap SQL snippet (insert into public.admin_users ... where email = KC email) to onboard self as first admin; (3) magic link verify end-to-end via /auth?role=admin → magic link → /admin dashboard。(9) Git push SKIPPED — GH PAT expired (Q19 P0 carry-over 5+ cycles), 5 commits ahead locally now (8a7cb68 / 170abe0 / 3db6ccb / dae47cc + this v3.62.95); wrangler deploy chain keeps production live2026-09-0822:39 BSTv3.62.94Supabase project re-anchored — original project `fnmowtjonzbxsreazkxq` (set up Sep 4) unreachable via KC GitHub account (signup email ≠ socialmedia@; old org owner = different GitHub user); KC decision 2026-09-08 = pivot to fresh Supabase project under BS Portal org (`xhtlgnpshcpdbcajfffx.supabase.co`, Europe region)。(1) KC: opened new Supabase project under BS Portal org + pasted new Project URL + publishable (anon) key over Telegram; service_role key deferred to Phase 2 (Phase 1 magic link only needs anon key)。(2) Bot: schema.sql 450 行 idempotent migration pasted into Supabase SQL Editor → KC 「Success. No rows returned」; 6 tables created (students / schools / messages / invites / student_profiles / school_dismissals) + 4 RLS policies + 2 triggers (handle_new_user + sync_student_profile) + 1 backfill。(3) Bot: local .env updated + CF Pages secrets re-uploaded (PUBLIC_SUPABASE_URL + PUBLIC_SUPABASE_ANON_KEY via wrangler pages secret put) + npx nuxi generate 858 routes green + wrangler pages deploy dist cutover at 22:32 BST。(4) Verify: production URL HTTP 200 (boardingmatch.pages.dev + preview 41137772.boardingmatch.pages.dev) + supabase auth/settings endpoint HTTP 200 (magic link confirmed enabled) + bundle confirmed new URL embedded in __NUXT__.config.public (no orphan OLD URL in dist)。(5) Sitemap bookkeeping bump (this commit): hero chip v3.62.93 → v3.62.94 + footer v3.62.93 → v3.62.94 + last-site-update comment v3.62.93 → v3.62.94 + ship log 1 row prepended (this v3.62.94 re-anchor) + §7 Email magic link row note text refresh。(6) NEXT.md prepend new Todays Done entry for v3.62.94 + Cumulative Counts Latest live version v3.62.89 → v3.62.94。(7) PROGRESS.md §1 Last refreshed 2026-09-05 → 2026-09-08 + Local HEAD v3.62.93 → v3.62.94 + Production SHA v3.62.93 → v3.62.94 verified live。** BLOCKER B1 status updated**: partial → partial (substantial — Phase 1 env + schema live, 1 of 4 sub-blockers fully unblocked; remaining 3 sub-blockers B1p2 Storage / B2 OCR / B3 GDPR 仍 pending) → hero chip 4 infra blocker → 3 infra blocker remaining。** git push SKIPPED** — GH PAT expired (Q19 P0 carry-over 5+ cycles), 3 commits ahead locally (8a7cb68 / 170abe0 / 3db6ccb Phase 1 close-out + Phase 2a School auth + Phase 2b Browse leads Supabase migration), wrangler deploy chain keeps production live。** Suggested follow-up cycles**: (1) KC manual magic link verify end-to-end via /auth?role=student (personal gmail, click email link, confirm /student dashboard load) — still pending 3rd cycle; (2) Phase 2 sequencing (2a/2b already coded locally — un-pushed; 2c Admin Supabase pending); (3) GH PAT refresh + backfill `git push origin main` (P0); (4) Supabase keep-alive cron (free tier 7-day inactivity pause, spec §9 long-term concern)2026-09-0518:50 BSTv3.62.93Bookkeeping drift cleanup (Pitfall #13) — Sep 3 cost-calculator track (v3.62.90 / v3.62.91 / v3.62.91.1) + Sep 4 Supabase Phase 1 cutover (3 commits) sitemap marker drift finally resolved。(1) sitemap.vue 4 個 version marker 全部 sync v3.62.92 → v3.62.93: hero chip L10 / footer L242 / last-site-update comment L393 / ship log topmost row。(2) §7 Auth row「Email magic link (學生)」note text refresh — 舊「Supabase env not configured」→ 新「v3.62.93 — Supabase env configured (11ad77f cutover: PUBLIC_SUPABASE_URL + ANON_KEY 喺 nuxt.config.ts runtimeConfig + dotenv load); auth/index.vue demo-mode-banner 自動 hide; students table + on_auth_user_created trigger (f013522) 喺 supabase 部署好; magic link end-to-end verify pending KC manual click-through」。(3) §7 row「真 Supabase Auth 後台」missing → partial (BLOCKER B1 partial — Phase 1 schema + RLS + auth trigger deployed + env wired; app-code cross-device sync logic + school + admin 仲待 Phase 2/3)。(4) §7 row「Supabase Postgres (跨 device 同步)」missing → partial (BLOCKER B1 partial — schema 4 tables (students / schools / messages / invites) + RLS + auth trigger deployed f013522 Sep 4; app code migration (useDB.ts ↔ supabase.from) 待 Phase 2)。(5) §7 row「Supabase Storage」note 加「Phase 1 = student magic link only; Storage = Phase 2」(status 仍 missing, BLOCKER B1 part 2 維持)。(6) Ship log 3 rows prepended — Row A = 2026-09-05 18:50 BST v3.62.93 本 bookkeeping drift cleanup commit; Row B = 2026-09-04 13:25 BST Supabase Phase 1 cutover bundle (ffedc72 + 11ad77f + f013522 3 commits); Row C = 2026-09-01 14:33 BST /cost-calculator track bundle (v3.62.91 + v3.62.91.1)。(7) NEXT.md prepend new Todays Done entry for v3.62.93 + Cumulative Counts Latest live version v3.62.92 → v3.62.93。(8) PROGRESS.md §1 Last refreshed 2026-08-30 → 2026-09-05 + Local HEAD v3.62.88 (0ed8a46) → v3.62.93 + Production SHA v3.62.88 → v3.62.93 verified live。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blocker Supabase-free per KC 2026-08-28 freeze (Phase 2/3 Supabase migration 仍 defer)。** Git push SKIPPED** — GH PAT expired (Q19 P0 carry-over 4+ cycles); wrangler deploy chain keeps production live。** Suggested follow-up cycles**: (1) KC manual magic link verify end-to-end (Sep 4 cutover critical unblock step), (2) Phase 2 sequencing decision (2a School auth migration / 2b Browse Supabase / 2c Admin Supabase), (3) GH PAT refresh + backfill `git push origin main` (P0)2026-09-0413:25 BSTv3.62.92+Supabase Phase 1 cutover — schema + env wired + email allowlist trimmed (3 commits bundle, previously wrangler-deployed but sitemap marker drift flagged per v3.62.92 row Pitfall flag)。(1) f013522 (Sep 4 11:46 BST) — Phase 1 backend scaffold: supabase/schema.sql 4 tables (students / schools / messages / invites) + RLS policies (owner SELECT/UPDATE/INSERT) + on_auth_user_created trigger (magic link auto-create students row) + .env.example PUBLIC_SUPABASE_URL + ANON_KEY placeholders。Idempotent safe re-run。(2) 11ad77f (Sep 4 12:38 BST) — Phase 1 cutover: auth/index.vue demo-mode-banner 加 v-if=isDemoMode (之前 unconditionally render, 即使 env 配置咗都仲顯示); nuxt.config.ts explicit dotenv load at config-evaluation time (Hermes terminal sub-shell 唔可靠 inherit shell env 到 npx-wrapped command, 所以 loadDotenv({path: resolve(__dirname, .env)}) 強制行)。Result: PUBLIC_SUPABASE_URL + ANON_KEY 喺 runtimeConfig.public 暴露, $isDemoMode ref 識 supabase env 一 set 就 return false, banner auto-hide。(3) ffedc72 (Sep 4 13:25 BST) — Auth email allowlist cleanup: useAuth.ts PERSONAL_EMAIL_DOMAINS 移除 qq.com / vip.qq.com / foxmail.com (qq family) + 163.com / 126.com / yeah.net (163 family); mainland China email provider 唔再當 personal email (公司 consultant 用呢啲 bypass §15.2 company-email gate 嘅漏洞封咗); error message 改 English (之前中英混雜)。Phase 1 scope = student magic link only; school signup + browse leads + invites + messages 全部仍 localStorage demo until Phase 2/3 migration。Build green (856 routes / no code regression), wrangler deploy 直接 cutover (per memory wrangler deploy b2e39cb8 done)。Magic link end-to-end verify pending KC manual click-through (critical Phase 1 unblock step)2026-09-0114:33 BSTv3.62.91.1/cost-calculator page ship (2 commits bundle, previously wrangler-deployed but sitemap marker drift flagged per v3.62.92 row Pitfall flag)。(1) v3.62.91 (Sep 1 14:27 BST, commit 28517b1) — /cost-calculator page (standalone UK boarding cost estimator): 新 page app/pages/cost-calculator.vue (input form + result panel + editable breakdown table) + 新 composable app/composables/useCostCalculator.ts (load + calc + per-line override) + 新 data file public/data/uk-boarding-costs.json (8 city baselines + 8 categories + assumptions) + prerender /cost-calculator 加到 nuxt.config.ts。Design (auto-pilot mode auto-decided): 8 cities matching existing REGION_SLUGS pattern + 8 cost categories (application/deposit/tuition+boarding/guardian/EAL/flights/visa/pocket) + currency GBP primary HKD secondary (HK parents mental model)。(2) v3.62.91.1 (Sep 1 14:33 BST, commit 4aacc5b) — hotfix /cost-calculator empty dropdowns: useCostCalculator.ts Vite import + useAsyncData pattern matching useRegionGuides.ts:11-15 reference (唔好 use useFetch /data/foo.json 喺 prerender 因為 static files 喺 nuxi generate 時未 served dist, useFetch return null, hydration payload empty, page mount 空白 dropdowns — bit by this rule v3.62.91 first deploy)。兩 commit 加埋 856 routes + 1 new prerender route。Build green, wrangler deploy direct upload zero regression。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blocker Supabase-free per KC 2026-08-28 freeze。Suggested follow-up cycles at ship time: (1) magic link verify end-to-end (Sep 4 cutover 嘅 unblock step), (2) Phase 2 sequencing decision2026-09-0221:23 BSTv3.62.92Student Inbox cleanup — removed duplicate "Your Grades" card from /student step-3 (Inbox & Messages). KC feedback 2026-09-02 04:19 BST: 嗰個 card 同 step-1 (Your Profile) 重複 + 喺 Inbox context 屬 progressive disclosure 嘅 anti-pattern。Fix: student.vue line 432-449 個 .your-grades-card block 完全移除 + 留低 comment 解釋 + 學生要 edit grades 仲可以通過 wizard step nav 返 step-1/2 (click "Upload Grades" 或 "Your Profile" trigger loadExistingGrades → currentStep=0)。Phase 1 audit clean (single component, single block, no CSS impact, step-1/2 unchanged, loadExistingGrades fn untouched)。** Pitfall flag**: v3.62.90 / v3.62.91 / v3.62.91.1 (cost-calculator track) 喺 sitemap marker 入面未 ship — underlying code 已 wrangler-deployed, sitemap bookkeeping drift。下次 cron tick drift cleanup 要 backfill。Sitemap bookkeeping bump (this commit): hero chip v3.62.89 → v3.62.92 + footer v3.62.89 → v3.62.92 + last-site-update comment v3.62.89 → v3.62.92 + ship log 1 row prepended (this v3.62.92 inbox cleanup)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blocker Supabase-free per KC 2026-08-28 freeze2026-08-3000:04 BSTv3.62.89Cron tick drift cleanup — PROGRESS.md long-term tracker refresh (22h stale yellow flag carried over 3 cycles)。(1) §1 Last refreshed: 2026-08-29 13:55 BST → 2026-08-30 00:04 BST + Local HEAD v3.62.73 → v3.62.88 (commit `3fc2c89` → `0ed8a46`) + Production SHA v3.62.88 verified live via curl 200 on /sitemap + /。(2) §1 new row appended: 「2026-08-29 evening→30 (v3.62.73→88)」summarizing 16 minor versions across 4 tracks — dead-code survey cadence (v3.62.75/77/88) + switch-school demo affordance (v3.62.79→80→81→85) + per-region guide section (v3.62.82→83→84) + bookkeeping + drift cleanup (v3.62.73/74/86/87),全部 verified Playwright-cap。(3) §5 Locally-Built but NOT Deployed: v3.62.59 → v3.62.88 + note about Pitfall #12 GH PAT carry-over 3 commits un-pushed。(4) §11 new Track 10 appended (v3.62.73→88 housekeeping push, 5 concurrent tracks)。(5) §12 new Q19 (P0 carry-over): GH PAT expired — KC 需 refresh from https://github.com/settings/tokens (need `repo` scope), paste into `~/workspace/github-pat.md` (chmod 600), then `git push origin main` to backfill 3 commits。(6) §12 new Info D: Pitfall #12 (committed-but-not-pushed) status as of v3.62.88 — wrangler direct upload chain keeps production live despite git history lag。Sitemap bookkeeping bump (this commit): hero chip v3.62.88 → v3.62.89 + footer v3.62.88 → v3.62.89 + last-site-update comment v3.62.88 → v3.62.89 + ship log 1 row prepended (this v3.62.89 PROGRESS.md refresh) + NEXT.md prepend new Todays Done entry。** Phase 1 audit** ⚠ 2 yellow flags carried over: (a) GH PAT dead (now 3 commits un-pushed: v3.62.86 + v3.62.87 + v3.62.88, KC action item Q19), (b) PROGRESS.md 22 hours stale (this cycle resolves)。** Phase 2 queue priority 4 drift cleanup** (priority 1-3 clear: no visual verify carryover / no newest ship to verify / §6 §8 both defer)。** Suggested follow-up cycles**: (1) GH PAT refresh + backfill `git push origin main` (P0 — local commits accumulating to 4), (2) 「Switch to demo school #N」picker (multi-school demo testing per NEXT.md carry-forward), (3) SEO content /regions/[slug]/guide/ skeleton 深化, (4) dead-code survey pass on student.vue round 2 / admin.vue round 2 / composables round 3。** Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze**2026-08-2922:56 BSTv3.62.88Dead-code survey admin.vue round 1 — 4-layer scan complete (top-level decls / imports / CSS classes / inner functions + local vars), 0 truly-dead code found。** Scan 1 (top-level declarations)**: 175 const/function/interface/type 全部有 template use,初版 scanner bug 用 find('CLOSED_TEMPLATE') 撞到 nested template block 報 25 個 false positive,改用 rfind 後 0 個真 dead。** Scan 2 (imports)**: 1 import (yearStripeMap from useAuth) — 1 declaration + 1 template use at L1175 `:class="['grade-row', yearStripeMap(...)[g.year] === 'a'..." = used。** Scan 3 (CSS classes)**: 21 CSS-defined + 197 template-used — 4 false-positive (Dt7PtjH7 = scoped hash in comment / css = parser artifact / msg-thread__chevron + --open = used at L785)。** Scan 4 (inner functions + local vars)**: 36 arrow/function + 163 local declarations — 0 unused。** Net: 0 lines removed**, admin.vue 2403 lines 維持 — admin.vue has been actively maintained since v3.57 era, no orphan / unused code at any scope level。** Sitemap bookkeeping bump** (this commit): hero chip v3.62.87 → v3.62.88 + footer v3.62.87 → v3.62.88 + last-site-update comment v3.62.87 → v3.62.88 + ship log 1 row prepended (this v3.62.88 survey) + NEXT.md prepend new Todays Done entry。** Phase 1 audit** ✅ clean (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX)。** Phase 2 queue priority 5 housekeeping auto-pick** (priority 1-4 clear: no carryover / v3.62.87 just Playwright verified / §6 §8 both defer / drift cleanup empty)。** ⚠ Audit yellow flags carried over**: (a) GH PAT dead (now 3 commits un-pushed: v3.62.86 + v3.62.87 + this v3.62.88, KC 需 refresh from https://github.com/settings/tokens), (b) PROGRESS.md 9 hours stale (last refresh 2026-08-29 13:55 BST, approaching 1-day threshold)。** Suggested follow-up cycles**: (1) GH PAT refresh + backfill `git push origin main` (P0 — local commits accumulating), (2) PROGRESS.md refresh, (3) 「Switch to demo school #N」picker, (4) SEO content /regions/[slug]/guide/ skeleton 深化。** Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze**2026-08-2921:55 BSTv3.62.87Cron tick visual verify v3.62.86 NEXT.md Cumulative Counts drift cleanup live confirmed via Playwright /sitemap cap, zero regression。(1) /sitemap HTTP 200 ✓ + chip「v3.62.86 (live)」完整 render ✓ + footer v3.62.86 ✓ + ship log topmost row v3.62.86 (2026-08-29 21:50 BST Cron tick NEXT.md Cumulative Counts drift cleanup) 完整 render ✓。(2) DOM facts: v3.62.86 substring 出現 8 次 (chip 1 + footer 1 + ship log row 1 + NEXT.md Cumulative Counts line 1 + various in DESC text), v3.62.85 substring 仲剩 9 次 (previous Todays Done entry + previous ship log row + Cumulative Counts 舊 entry references — expected, 全部 historical references)。(3) 1 hydration mismatch console.error — known v3.62.67 Reset-demo hotfix Nuxt static hydration issue, 唔係 v3.62.86 regression, 唔 block verify。(4) Vision 全 page scan: zero layout breakage / text overflow / missing section / contrast issue (drift cleanup 純 bookkeeping, chip / footer / ship log row 全部從 v3.62.85 → v3.62.86 線性 bump, 視覺 zero change vs v3.62.85)。Sitemap bookkeeping bump (this commit): hero chip v3.62.86 → v3.62.87 + footer v3.62.86 → v3.62.87 + last-site-update comment v3.62.86 → v3.62.87 + ship log 1 row prepended (this v3.62.87 visual verify) + NEXT.md prepend new Todays Done entry。Pitfall #13 (NEXT.md Cumulative Counts drift) 全部 resolved — Latest live version v3.62.72 → v3.62.86 line persist live。** git push SKIPPED both v3.62.86 + v3.62.87 commits due to GH PAT dead — KC 需 refresh from https://github.com/settings/tokens + backfill `git push origin main` after token refresh (commit 041b680 v3.62.86 + this v3.62.87 commit both un-pushed locally)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze。Suggested follow-up cycles: (1) dead-code survey admin.vue (NEXT.md carry-forward #3 — admin.vue has not been audited since v3.57 area), (2) PROGRESS.md ≥ 1 day stale check (last refresh v3.62.68 2026-08-29 11:17 BST, ~10.5 hours ago), (3) GH PAT refresh + backfill `git push origin main` (P0 this cycle — local commits accumulating)2026-08-2921:50 BSTv3.62.86Cron tick drift cleanup (Pitfall #13) — NEXT.md Cumulative Counts drift resolved + sitemap bookkeeping bump。(1) NEXT.md 「Latest live version」v3.62.72 → v3.62.86 (14 versions stale now resolved — underlying code live v3.62.85 confirmed via curl /sitemap hero chip grep + wrangler deployment list, only NEXT.md counter lagged)。(2) app/pages/sitemap.vue: hero chip v3.62.85 → v3.62.86 + footer v3.62.85 → v3.62.86 + last-site-update comment v3.62.85 → v3.62.86 + ship log 1 row prepended (this v3.62.86 drift fix)。Phase 1 audit ⚠ 2 concerns caught: (a) GH PAT dead (git ls-remote fails 「Invalid username or token」, ~/workspace/github-pat.md empty — prior session push attempts blocked; recovery: skip git push, deploy via wrangler direct upload per skill pre-flight recipe); (b) NEXT.md Cumulative Counts drift (14 versions stale on Latest live version line)。Phase 2 drift cleanup (queue priority 4)。** git push SKIPPED this cycle due to PAT dead — KC 需 refresh from https://github.com/settings/tokens + backfill `git push origin main` after token refresh。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze。Visual verify + bookkeeping bump to v3.62.87 follow-up same cycle (Pitfall #13 2-commit pattern)2026-08-2920:43 BSTv3.62.85Cron tick visual verify — v3.62.79/80 switch-school demo affordance live confirmed via Playwright 3-step cap (Demo Boarding → Eton → Harrow switch), zero regression。(1) /school/?demo=1 with bm_demo_mode=on → header「🎭 Switch school…」dropdown render with 9 options (1 placeholder + 8 verified demo schools: Eton premium / Harrow premium / Cheltenham standard / St Andrews payg / Tonbridge standard / Uppingham premium / Roedean payg / Marlborough standard) ✓ + initial subtitle「Demo Boarding School — [email]」+ 「🔧 Demo: ON」chip + 「🔄 Reset demo」button + chat icon button 全部 render ✓。(2) selectOption Eton → setDemoSchoolSession(schoolreg-seed-eton) + reload → subtitle「Eton College — registrar@eton.test」+ premium criteria preset 工作正常 ✓。(3) selectOption Harrow → setDemoSchoolSession(schoolreg-seed-harrow) + reload → subtitle「Harrow School — admissions@harrow.test」+ dropdown 仍 render 繼續 cycle ✓。3 page 全部 HTTP 200 + vision 全 page scan zero layout breakage / text overflow / missing section / contrast issue (minor 3 個 hydration mismatch console.error — v3.62.67 Reset-demo hotfix 之後嘅 known Nuxt static hydration issue, 唔係 v3.62.79/80 regression)。useDB.setDemoSchoolSession() helper (useDB.ts L2994-3043: find verified reg + build SchoolUser per plan_tier preset + persist bm_school_session + bumpTick) + school.vue 🎭 Switch school dropdown (template + script) + v3.62.80 setDemoSchoolSession: guard school_address split on undefined hotfix 全部 persist live。Sitemap bookkeeping bump (this commit): hero chip v3.62.84 → v3.62.85 + footer v3.62.84 → v3.62.85 + last-site-update comment v3.62.84 → v3.62.85 + ship log 1 row prepended (v3.62.85 visual verify) + NEXT.md prepend new Todays Done entry。Phase 1 audit ✅ clean (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX / queue sanity good — 2 個 active queue 全部 defer §6 P3 + §8 P3+ per KC 2026-08-28 freeze)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze。Suggested follow-up cycles: (1) dead-code survey admin.vue (NEXT.md carry-forward #3 — 2026-08-29 17:15 session 提過, 仍未做), (2) PROGRESS.md ≥ 3 days stale check (last refresh v3.62.68 2026-08-29 11:17 BST, ~9.5 hours ago — 接近 1 天 stale threshold)2026-08-2919:30 BSTv3.62.84Cron tick visual verify — v3.62.82 per-region SEO guide section live confirmed via Playwright 3-region cap, zero regression + sitemap drift cleanup。(1) /regions/london → 24 London schools render ✓ + new guide section block (region-guide class, guide-heading h2 + intro paragraph + 2-col fact dl cost-band + distance + 4 picks grid Westminster / Harrow / Dulwich / Whitgift + 3 tips bullets + navy CTA ✓。(2) /regions/south-east → 5 picks (Eton / Winchester / Tonbridge / Stowe / Brighton) + 3 tips + 2 facts (£15-25k term / 30-90min train to Waterloo/Victoria) 全部 render ✓。(3) /regions/north-east → 0 picks resilience test PASS: h2 + intro + 2 facts + tips 全部 render 正常,「Strongest schools」h3 由 v-if 自動 skip,零空 gap / 零 orphan header / layout reflow 乾淨 ✓。3 page 全部 HTTP 200 + vision 全 page scan zero layout breakage / text overflow / missing section / contrast issue + console error 0 個。useRegionGuides composable + region-guides.json (9 regions × intro/cost_band/distance/top_picks_urns/tips) + /regions/[slug].vue guide section block (idempotent v-if regionGuide gate) 全部 persist live。Sitemap bookkeeping bump (this commit): hero chip v3.62.78 → v3.62.84 + footer v3.62.78 → v3.62.84 + last-site-update comment v3.62.78 → v3.62.84 + ship log 1 row prepended (v3.62.84 visual verify) + NEXT.md prepend new Todays Done entry。Pitfall #13 (sitemap drift caught in audit) — git HEAD v3.62.83 但 live hero chip/footer 仲停留 v3.62.78 (5 commits bookkeeping missed:v3.62.79/80/81/82/83 全部 underlying code 已 deploy,只有 sitemap.vue marker 唔 update)。Phase 1 audit warning drift caught then Phase 2 fix。Bump v3.62.83 → v3.62.84 (唔跳號 — audit row count = 1)。Phase 1 audit clean on rerun (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX / queue sanity good — 2 個 active queue 全部 defer §6 P3 + §8 P3+ per KC 2026-08-28 freeze)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers ... [truncated]2026-08-2918:25 BSTv3.62.78Cron tick visual verify — v3.62.77 dead-code survey round 2 (3 truly-dead composable exports removed) live confirmed via Playwright 3-page cap, zero regression。(1) /sitemap → hero chip「v3.62.77 (live)」+ ship log topmost row v3.62.77 dead-code round 2 完整 render + 402 schools SEO band 完好 ✓ + 8 user-facing page card counter audit 55/8/9/3=75 維持 ✓。(2) /regions/london → 24 London schools 全部 render (useDfEIndex call site L185 工作正常,useDfESchool 10 行移除後 zero caller 受影響) ✓ + 4 KPI cards (24 Total / 8 Boys / 1 Girls / 15 Co-ed) + filter sidebar + sort A-Z + 8 region pills 完好。(3) /schools/138312 (Harrow) → Harrow School full profile render: name + URN 138312 badge + 📍 Harrow LA label + 5 Sheepcote Road Harrow on the Hill HA1 2HW address + Boys 13–18 + Secondary + Sixth form pill + 835 pupils + 🎩 Welcome quote + Academic Highlights (10 Oxbridge / 65% Russell Group) + Signature Subjects (STEM/Oxbridge Prep/Music/Sport) + Boarding Life ✓ + **v3.62.53 Harrow data fix still held** (zero Cumberland string on page — 之前 misclass "Harrow, Cumberland" 完全 cleared, 138312.json metadata LANAME → "Harrow" / LA → "312" + index.json la_name → "Harrow" + la_aggregates_3year.json las["312"].name → "Harrow" 全部 persist live)。3 page 全部 HTTP 200 + vision 全 page scan zero layout breakage / text overflow / missing section / contrast issue。useDB.ts 3114 lines (EmailBounceLogEntry + currentDigestSlot removal 後) + useDfEData.ts 187 lines (useDfESchool removal 後) render 完全正常 — dead-code survey 嘅 「zero functional change」 承諾 100% upheld live。Sitemap bookkeeping bump (this commit): hero chip v3.62.77 → v3.62.78 + footer v3.62.77 → v3.62.78 + last-site-update comment v3.62.77 → v3.62.78 + ship log 1 row prepended (v3.62.78 visual verify) + NEXT.md prepend new Todays Done entry。Phase 1 audit ✅ clean (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX / queue sanity good — 2 個 active queue 全部 defer §6 P3 + §8 P3+ per KC 2026-08-28 freeze)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze。Suggested follow-up cycles: (1) dead-code survey admin.vue (hasn't been audited since v3.57 area — NEXT.md carry-forward #3), (2) 「Switch to demo school #N」picker (multi-school demo testing), (3) SEO content /regions/[slug]/guide/ skeleton2026-08-2917:15 BSTv3.62.77Dead-code survey round 2 — removed 3 truly-dead composable exports (script 4 scan across all app/ .ts files with 9-strategy fuzzy match, cross-checked via string-key + map-key grep)。** (1) useDfESchool (useDfEData.ts, 0 callers)**: alternative useAsyncData composable for fetching single school by URN, but the in-file comment itself notes 「/schools/[URN] works around this with globalThis._importMeta_.glob('eager')」+「SEO pages we use useFetch」— so this 10-line composable was never the chosen path。** (2) EmailBounceLogEntry interface (useDB.ts, 0 callers)**: spec §12.8 Resend webhook schema stub (id / school_id / attempted_at / bounce_type / reason / admin_notified / created_at), infra-blocked per KC 2026-08-28 「Supabase 遲啲先搞」freeze。** (3) currentDigestSlot function (useDB.ts, 0 callers)**: spec §12.9 cron-slot helper returning 「9am|1pm|3pm|weekend|between」, also infra-blocked。** Net: -40 lines** (useDB.ts 3144 → 3114 + useDfEData.ts 197 → 187), zero functional change, zero spec contract change (both §12.8 + §12.9 still listed in spec.md infra section)。** Build green** (856 routes / 14.8s, no new dependencies, no new pages, no new prerender routes)。** wrangler deploy** https://5ebf8c6d.boardingmatch.pages.dev ✓。** Curl live verify** /sitemap 200 + /student 200 + / 200 + version grep v3.62.77 ✓。** Sitemap bookkeeping bump** (this commit): hero chip v3.62.76 → v3.62.77 + footer v3.62.76 → v3.62.77 + last-site-update comment v3.62.76 → v3.62.77 + ship log 1 row prepended (v3.62.77 dead-code round 2)。** NEXT.md** prepend new Todays Done entry for v3.62.77 at top。** Phase 1 audit** ✅ clean (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX / queue sanity good — 2 個 active queue 全部 defer §6 P3 + §8 P3+ per KC 2026-08-28 freeze)。** Queue priority 5 housekeeping auto-pick** (priority 1-4 clear: no carryover / newest ship v3.62.75 already Playwright verified via v3.62.76 / no non-defer PRD item / drift cleanup queue empty)。** CF token pre-flight**: cfut_w5d prefix + 53 length healthy ✓。** Suggested follow-up cycles**: (1) 「Switch to demo school #N」picker (multi-school demo testing per NEXT.md carry-forward), (2) SEO content /regions/[slug]/guide/ skeleton, (3) dead-code survey pass on admin.vue (hasn't been audited since v3.57 area)。** Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze**2026-08-2916:10 BSTv3.62.76Cron tick visual verify — v3.62.75 dead-code survey student.vue round 1 live confirmed via Playwright /student cap (zero regression)。Step-3 Inbox render OK: wizard step-3 active (navy circle with "3") + Profile Complete 🎉 banner + Demo: OFF toggle + Sign Out header + 1 grade entry (Mathematics 2024 A*) + Invites/Messages tab selector + empty state mailbox icon ("No invites yet")。Vision 全 page scan: zero layout breakage / text overflow / missing section / contrast issue。statusColor function confirmed dead — DOM grep statusColorRefInDOM: false ✓ (the 1 declaration at L1975 was indeed zero-caller — actual invite status colour rendering uses inline color mapping elsewhere)。Zero Telegram affordance ✓ (per v3.62.55 full removal still held)。Zero code change, pure bookkeeping: sitemap ship log entry + hero chip v3.62.75 → v3.62.76 + footer v3.62.75 → v3.62.76 + last-site-update comment v3.62.75 → v3.62.76 + NEXT.md prepend2026-08-2915:02 BSTv3.62.75Dead-code survey student.vue round 1 — removed unused statusColor function (1 declaration, 0 template / 0 script callers, declared at L1975, arrow returning { sent: amber, accepted: green, declined: gray }[s] || gray for invite status colour, but the actual /student inbox card 用 inline color mapping elsewhere, never bound via :class or v-bind)。2664 → 2663 lines (-1 line), zero functional change。Build green (856 routes / 14.6s), wrangler deploy https://dae651c4.boardingmatch.pages.dev ✓, curl /student 200 + /sitemap 200 + live chip v3.62.75 grep ✓。Phase 1 audit clean (git on main / no dirty state / sitemap HTTP 200 / CF token OK cfut_w5d / 零 TODO/FIXME/XXX / queue sanity good — 2 個 active queue 全部 defer §6 P3 + §8 P3+ per KC 2026-08-28 freeze)。Queue priority 5 housekeeping auto-pick (priority 1-4 clear: no carryover / newest ship v3.62.75 already Playwright-style verified via curl / build green / no non-defer PRD item / drift cleanup queue empty)。Suggested follow-up cycles: (1) dead-code survey student.vue round 2 (template literal scan for :class="${var}--${x}" patterns — 已知 false-positive area), (2) 「Switch to demo school #N」picker, (3) SEO content /regions/[slug]/guide/ skeleton。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze2026-08-2913:58 BSTv3.62.74Bookkeeping catch-up — PROGRESS.md §1 Local HEAD line caught up from v3.62.72 (a130fb6) to v3.62.73 (3fc2c89) after bookkeeping amend sequence c90b746 → 3fc2c89。Cosmetic 1-line fix — keep /sitemap/PROGRESS.md/NEXT.md honest about which commit hash 對住 Local HEAD (a130fb6 was actually superseded by 3fc2c89)。Pure housekeeping — 唔 ship code change,唔 break demo affordances (Playwright re-verified v3.62.74: /sitemap + /school both 200, version grep v3.62.74 ✓, Browse (20)→(25)→(30) +5 idempotent still works, Reset demo still hides button)。Active queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze2026-08-2913:45 BSTv3.62.72School-side demo affordance — ➕ Add 5 random leads button on Browse tab + dbTick mirror fix + bookkeeping。useDB.addRandomLeads(count) helper: 防禦性 cap 1..50 / 自動找下一個 numeric suffix (l1..l20 → l21..l25 first click) / random region from ALL_REGIONS (18 entries) + random gender from ALL_GENDERS + random age_band from ALL_AGE_BANDS + random surname from 65-entry surname pool (culturally balanced — Chinese / Korean / Japanese / South Asian / SE Asian / Arab / Latin) + application_year stagger 50% current cycle / 30% +1y / 20% +2y (matches buildSeedLeads cycle-closed mix)。school.vue: ➕ Add 5 random leads button (margin-left:auto) 喺 browse-tabs-row 嘅 Dismissed pill 右邊,demoMode-gated (template v-if=demoMode + handler 安全 net)。**v3.62.72 hotfix: dbTick.value++ mirror in onAddRandomLeads** — first deploy v3.62.71 had a bug where Browse (N) counter + lead cards 唔 re-render after click because school.vue leads computed reads 學校-side local `dbTick` ref not useDB internal `bumpTick()`. Mirrors dismissStudent (line 1835) / passLeadStack (line 1861) / restoreStudent (line 1971) / dismissLeadBySchoolAdmin (line 1984) / restoreDismissedLead (line 2011) pattern — local dbTick.value++ after useDB mutation. After fix: click → Browse (20) → (25) → (30) → (35) verified via Playwright ✓。Build green (856 routes / 14.7s), wrangler deploy https://1ba37195.boardingmatch.pages.dev, curl /school 200 + /sitemap 200 + version grep v3.62.72 ✓。Queue priority 5 housekeeping auto-pick — Phase 1 audit clean + no carryover + no non-defer PRD item + drift cleanup queue empty。Next-up queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze。Suggested follow-up cycles: (1) 「Switch to demo school #N」picker (multi-school demo testing), (2) SEO content /regions/[slug]/guide/ skeleton, (3) Dead-code survey pass on student.vue (~10 unused fn candidates per school.vue v3.62.57 -36 行 precedent)2026-08-2912:39 BSTv3.62.70Cron tick visual verify — v3.62.67 Reset-demo affordance + v3.62.66 region revert + v3.62.69 drift reconcile 全部 live confirmed via Playwright 4-page cap (/sitemap + /student + /school + /admin with demoMode=on)。Hero chip「v3.62.70 (live) · 2 個 active queue (P3 §6 Consultant + P3+ §8 Revenue) + 4 個 infra blocker + Telegram 完全刪走」✓ + ship log topmost row v3.62.70 + footer v3.62.70 + last-site-update comment v3.62.70 + PRD h2「2 active queue items」✓ + PRD cards §6 Consultant P3 defer + §8 Revenue P3+ defer render ✓ + blocker band 4 infra blocker (B1 Supabase/B1p2 Storage/B2 OCR/B3 GDPR) 全部 render ✓ + SEO rollout band 9 regions × 402 schools render ✓ (vision hallucination of 「462 schools」+ city-name regions 已知 failure mode,source code confirm 24 + 162 + 64 + 53 + 32 + 23 + 22 + 18 + 4 = 402) + 8 user-facing page card grid 全部 wired + counter audit 55/8/9/3=75 維持 ✓。**v3.62.67 Reset-demo affordance live confirmed (Queue priority 1 carryover cleared)**: 3 roles (student / school / admin) × Demo toggle + Reset demo button = 6 buttons render when demoMode=on ✓ (vision cap confirmed);reset behavior: 13 bm_* keys (1 demo_mode + 1 demo_db + 1 student_session + 1 admin_session + 7 school_sessions + 1 last_visit + ...) → 0 bm_* keys after Reset demo click + reload ✓ (resetDemoData() wipe + next mount getDB() re-seed 工作正常)。4 page 全部 HTTP 200 + vision 全 page scan 無 layout breakage / text overflow / missing section。Zero code change, pure bookkeeping: NEXT.md prepend + sitemap ship log entry + hero chip v3.62.69 → v3.62.70 + footer + last-site-update comment2026-08-2911:30 BSTv3.62.69Cron tick drift reconcile — push un-pushed v3.62.66/67/68 (3 commits committed-but-not-pushed) + Cloudflare deploy + sitemap chip v3.62.65 → v3.62.69 + footer v3.62.69 + last-site-update comment v3.62.69 + ship log 3 rows prepended (v3.62.66 region revert / v3.62.67 Reset-demo affordance / v3.62.68 PROGRESS.md refresh) + NEXT.md Latest live version v3.62.63 → v3.62.68 + Todays Pending / Tomorrow's Plan / Cumulative Counts sync。Pitfall #12 (committed-but-not-pushed drift) recovery chain: Phase 1 audit caught local=fc005be vs remote=840c088 gap, auto-pilot handled 5-step push+build+deploy+curl+bookkeeping chain without KC input (un-pushed commits are non-skip-list scope: region data fix + Reset-demo UI + PROGRESS.md refresh — all safe to auto-ship)。Next-up queue 維持 §6 P3 Consultant defer + §8 P3+ Revenue defer2026-08-2911:17 BSTv3.62.68PROGRESS.md §1 + NEXT.md prepend refresh (trackers sync with HEAD v3.62.67)。PROGRESS.md: §1 header timestamp + Local HEAD v3.62.59 → v3.62.67 + Production SHA v3.62.59 → v3.62.67 + Drift flag + Build size bullet + 2026-08-29 mid timeline entry (v3.62.66 region REVERT + v3.62.67 Reset-demo affordance) + v3.62.58 timeline note (v3.62.66 corrected it)。NEXT.md: prepend new Todays Done section for v3.62.66/67 (auto-pilot cycle 1) at top — describes the revert + the affordance + Playwright verification + 4 queued follow-up cycles。Zero code change, pure bookkeeping — but now part of recovery chain (committed-but-not-pushed drift recovered in v3.62.69 cron cycle)2026-08-2911:14 BSTv3.62.67Reset-demo-data affordance + Demo toggle on school/admin header。(1) useDB.ts: new resetDemoData() wipes bm_* keys (DB + sessions + flag) so next getDB() re-seeds from scratch; (2) student.vue: 加「🔄 Reset demo」button next to Demo toggle, only visible when demoMode is on; (3) school.vue: previously had no header Demo toggle — added both Demo toggle and Reset-demo buttons to page-header-actions (next to Messages); (4) admin.vue: added Demo toggle and Reset-demo buttons to header (admin was missing both; only student.vue had them)。Click flow: button → db.resetDemoData() → window.location.reload() → next mount's getDB() re-seeds with fresh 20-lead pool + 8 verified schools + 2 pending registrations。Lets KC re-test the full flow end-to-end from any role without touching DevTools2026-08-2911:08 BSTv3.62.66revert v3.62.58 misclassified region fix。Postcodes.io (ONS authoritative) confirms: (1) ST14 5BS = Derbyshire Dales (East Midlands, NOT West Midlands) — v3.62.58 had wrongly moved Abbotsholme (URN 113003, Uttoxeter) to West Midlands / Staffordshire; (2) NN13 5LB = Buckinghamshire (South East, NOT East Midlands) — v3.62.58 had wrongly moved Beachborough (URN 110550, Brackley) to East Midlands / Northamptonshire。My v3.62.58 manual cross-check used outdated UK region knowledge (county boundary changes over time)。Restored original region + la_name for both URNs + by_region aggregate recomputed。6 row revert (3 region field + 3 la_name field) zero app code change2026-08-2910:25 BSTv3.62.65Cron tick visual verify — v3.62.64 NEXT.md Cumulative Counts drift cleanup live confirmed via Playwright /sitemap cap。Hero chip「v3.62.64 (live) · 2 個 active queue (P3 §6 Consultant + P3+ §8 Revenue) + 4 個 infra blocker + Telegram 完全刪走」✓ + ship log topmost row v3.62.64 (2026-08-29 10:19 BST NEXT.md Cumulative Counts drift: Latest live version v3.62.18→v3.62.63 + Open questions resolved 2→10 + Todays Pending/Tomorrow's Plan stale 2026-08-17 refresh) ✓ + footer v3.62.64 ✓ + PRD h2「2 active queue items」✓ + PRD cards §6 Consultant P3 defer + §8 Revenue P3+ defer render ✓ + blocker band 4 infra blocker (B1 Supabase Auth+DB / B2 OCR / B3 GDPR / B4 Anti-spam) 全部 render ✓ + SEO rollout band 9 regions × 402 schools render ✓ + 8 user-facing page card grid (Public/Auth/Student/School/Admin/Sitemap/Regions/School profile) 全部 wired + status counter 顯示 ✓。Vision 全 page scan 無 layout breakage / text overflow / missing section / contrast issue (minor vision hallucination of B4 label + landing page card label 已知 vision failure mode — source code confirm 4 blocker cards + 8 page cards render 正確)。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry + hero chip v3.62.64 → v3.62.65 + last-site-update comment + footer2026-08-2910:19 BSTv3.62.64Cron tick drift cleanup — NEXT.md Cumulative Counts section 45 versions stale。Latest live version v3.62.18 → v3.62.63 (deployed 08:14 BST per v3.62.63 visual verify of v3.62.62 sitemap counter drift cleanup) + Open questions resolved 2 → 10 (2 on 2026-08-17: Q3/Q5; +8 on 2026-08-29 v3.62.60: Q1/Q2/Q4/Q6/Q7/Q8/Q9/Q11) + Todays Pending stale 2026-08-17 v3.62.26 reference → current active queue (§6 P3 Consultant defer + §8 P3+ Revenue defer + 4 infra blockers Supabase-free per KC 2026-08-28 freeze) + Tomorrow's Plan stale 2026-08-17 polish details → cron tick auto-pilot cadence + carry-forward spec §13/§14/§15 status。Zero code change, pure bookkeeping: NEXT.md prepend + 3 section rewrites + 2 Cumulative Counts counter fixes + sitemap ship log entry + hero chip v3.62.63 → v3.62.64 + last-site-update comment + footer2026-08-2908:14 BSTv3.62.63Cron tick visual verify — v3.62.62 sitemap counter drift cleanup live confirmed via Playwright /sitemap cap。Hero chip「v3.62.62 (live)」+「2 個 active queue (P3 §6 Consultant + P3+ §8 Revenue)」+「Telegram 完全刪走」✓ + ship log topmost row v3.62.62 (2026-08-29 07:08 BST counter drift 1→2) ✓ + footer v3.62.62 ✓ + PRD h2「2 active queue items」✓ (v3.62.62 fix 起嘅 counter 1→2 drift 完全 resolved) + PRD cards §6 Consultant P3 defer + §8 Revenue P3+ defer render ✓ + blocker band 4 infra blocker (B1 Supabase/B1p2 Storage/B2 OCR/B3 GDPR) 全部 render ✓ + SEO rollout band 9 regions × 402 schools render ✓ + 8 user-facing page card grid (Public/Auth/Student/School/Admin/Sitemap/Regions/School profile) 全部 wired + status counter 顯示 ✓。Vision 全 page scan 無 layout breakage / text overflow / missing section / contrast issue (minor right-sidebar text truncation in 4 blocker cards 已知設計 — 唔係 v3.62.62 regression)。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry + hero chip v3.62.62 → v3.62.63 + last-site-update comment + footer2026-08-2907:08 BSTv3.62.62Cron tick drift cleanup — hero chip counter 1→2 align with PRD roadmap「2 active queue items」。Hero chip「v3.62.62 (live) · 2 個 active queue (P3 §6 Consultant + P3+ §8 Revenue)」+ PRD h2 維持「2 active queue items」+ ship log topmost row v3.62.62 + last-site-update comment v3.62.61 → v3.62.62 + footer v3.62.48 → v3.62.62。Counter audit 55/8/9/3=75 維持不變。Active queue 維持 §6 P3 Consultant defer-for-solo-testing + §8 P3+ Revenue defer-for-spec + 4 infra blocker (B1 Supabase/B1p2 Storage/B2 OCR/B3 GDPR) Supabase-free per KC 2026-08-28 freeze。Zero code change, pure bookkeeping: NEXT.md prepend + sitemap ship log entry + hero chip bump + last-site-update comment + footer version2026-08-2906:05 BSTv3.62.61Cron tick visual verify — v3.62.60 PROGRESS.md refresh live confirmed via Playwright /sitemap cap。Hero chip「v3.62.60 (live)」+「Telegram 完全刪走」✓ + ship log topmost row v3.62.60 (2026-08-29 04:57 BST PROGRESS.md long-term tracker refresh) ✓ + counter audit 55 done / 8 partial / 9 missing / 3 deferred = 75 維持 ✓ + 9 regions × 402 schools prerendered (24 London + 162 SE + 64 SW + 53 EE + 32 WM + 23 Yorkshire + 22 EM + 18 NW + 4 NE = 402 ✓) + 8 user-facing page 完全 wired + PRD roadmap 2 active queue items (§6 Consultant P3 defer + §8 Revenue P3+ defer) + 4 infra blocker (B1 Supabase Auth+DB / B1p2 Storage / B2 OCR / B3 GDPR) 全部 render 正常。Vision 全 page scan 無 layout breakage / text overflow / missing section。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry + hero chip v3.62.60 → v3.62.61 + last-site-update comment2026-08-2904:57 BSTv3.62.60PROGRESS.md long-term tracker refresh — 4 days stale (last 2026-08-25 @ v3.62.40, current v3.62.59, 12 minor versions missed)。§1 Snapshot dates + §2 Role surface last-touched + §3 Per-page feature status mark 6 optional fields/Lead Visibility/Ephemeral/Auth gate/Suspend/Thread grouping/Telegram removal/Harrow data fix/region drift/402 URN prerender all shipped + §4 Blockers reframe to current B1-B4 (Supabase/OCR/GDPR/Anti-spam) per KC 2026-08-28「Supabase 遲啲先搞」freeze + §6 Roadmap refresh (mark all P0-P5 shipped) + new §11 (v3.62.41→59 push, 9 concurrent tracks) + §12 Open Questions 8 resolved (Q1/Q2/Q4/Q6/Q7/Q8/Q9/Q11) + 6 active (Q12-Q18) + 3 informational。Zero code change, pure bookkeeping: PROGRESS.md + sitemap ship log entry + hero chip + last-site-update comment2026-08-2903:53 BSTv3.62.59Cron tick visual verify — v3.62.58 region drift fix live confirmed via Playwright 4-page cap。(1) /schools/113003 (Abbotsholme School) → Region: West Midlands / LA: Staffordshire / town: Uttoxeter / postcode: ST14 5BS ✓ (之前 misclass East Midlands / Derbyshire); (2) /schools/110550 (Beachborough School) → Region: East Midlands / LA: Northamptonshire / town: Brackley / postcode: NN13 5LB ✓ (之前 misclass South East / Buckinghamshire); (3) /regions/west-midlands → 33 schools, Abbotsholme 排第 2 entry (URN 113003 / Uttoxeter) ✓; (4) /regions/east-midlands → 22 schools, Beachborough 排第 1 entry (URN 110550 / Brackley) ✓。4 page 全部 HTTP 200 + 渲染正常 + 無 layout breakage。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry + hero chip + last-site-update comment。Next-up queue still §6 P3 consultant defer + §8 P3+ revenue defer (Supabase-free queue 維持)2026-08-2901:07 BSTv3.62.58region drift fix — boarding-schools.json 兩個獨立學校 region 分錯:(1) Abbotsholme URN 113003 — town Uttoxeter ST14 屬 Staffordshire,應該係 West Midlands (之前 misclass 做 East Midlands / Derbyshire);(2) Beachborough URN 110550 — town Brackley NN13 屬 Northamptonshire,應該係 East Midlands (之前 misclass 做 South East / Buckinghamshire)。Postcode → county reference 對返 boarding-schools.json 內其他 row 嘅 region/LA 規則,cross-check gov.uk county boundary。修 20 行 (10 個 region field + 10 個 la_name field),淨 data fix zero app code change。Cron tick auto-pilot 喺 build cycle 內 audit 撈到呢個 drift,無需 KC prompt2026-08-2900:58 BSTv3.62.57school.vue dead-code cleanup — 刪 3 個 script 內被 declare 但從未被引用嘅 function: (1) checkAgain() 重複邏輯 (瀏覽 lead 重試 confirm dialog) 從未被 call; (2) toggleDemoMode() demo mode toggle hook 從未 bind 任何 UI; (3) buildSocialUrl() 社交 share URL builder 但 share button 後來砍咗。39 行減到 3 行 (-36 行),零 functional change。grep 全 codebase 確認 zero caller,build green 856 routes。亦順手 audit 其他 vue file (student / admin / school) 暫無類似 dead function2026-08-2820:34 BSTv3.62.56Cron tick visual verify — v3.62.55 Full Telegram removal live confirmed via Playwright 3-page cap。/sitemap hero chip 顯示「v3.62.55 (live) · … · Telegram 完全刪走」+ ship log first row v3.62.55 + counter audit 55/8/9/3=75 ✓ (matches v3.62.55 commit note); /school seed (bm_school_session + ?demo=1) → 200 OK no sign-in gate + telegramBrandMentions: 0 (text) / 0 (HTML) ✓ + Browse 20 leads hero card Mr Chan lead profile render; /student seed (bm_student_session 含 grades_json + profile_status:complete) → wizard step-3「Profile Complete!」🎉 + Invites/Messages tabs + telegramAffordance present: false + telegramBrandMentions: 0 / 0 ✓。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry。Next-up queue still §6 P3 consultant defer + §8 P3+ revenue defer2026-08-2821:05 BSTv3.62.55Full Telegram removal — KC 2026-08-28 v3.62.55 explicit「Telegram bot 完全唔做。del」。刪走所有 codebase 引用: (1) spec.md §6 Notifications line (Telegram bot @Boardingmatch_bot 整行移除) + §3 Student step 7 「via Telegram if linked」+ §12 「alongside Telegram」; (2) spec-addendum-prd-review.md §9.3 「AI 客服主要引導…(in-app widget + Telegram bot)」+ §9 code touch-points 「AI deflector widget (in-app + Telegram bot)」; (3) app/pages/school.vue 2 處 future-proofing adapter comment「Telegram 2-way」→「2-way messenger」(generic, 無 Telegram brand); (4) sitemap.vue 刪 2 個 feature row (Student「Telegram 邀請通知」deferred + Infra「Telegram bot production trigger」partial)。Counter audit: 77 → 75 項 total (55 done / 8 partial / 9 missing / 3 deferred), partial 9 → 8, deferred 4 → 3。Kept: spec.md §10 line 197 (KC personal hermes bot drives BoardingMatch build, 唔係 BoardingMatch product feature) + dfe-data-integration.md T1/T2/T3 (dev workflow trigger, 唔係 user-facing) + ship log 歷史 entry (v3.62.50/51/52/54)。Active queue 維持 §6 P3 consultant defer; §8 P3+ revenue defer 因 Telegram 移除後唔再需要 bot integration, 但仍要 KC OK scope2026-08-2819:27 BSTv3.62.54Cron tick visual verify — v3.62.53 Harrow data fix + v3.62.50 Telegram UI revert live confirmed via Playwright。/schools/138312 顯示「📍 Harrow」(Cumberland count 0, Harrow count 34, address "5 Sheepcote Road, Harrow on the Hill, Harrow HA1 2HW") + title "Harrow School" + /regions/london 列 Harrow School 為 24 schools 之一 ✓; /student step-3 seed (bm_student_session 含 grades_json + profile_status:complete) → telegramMentions: 0 / hasTelegramToggle: false / telegramToggles: [] ✓ (Telegram UI 零殘留)。Zero code change, pure bookkeeping: NEXT.md + sitemap ship log entry。Next-up queue still §6 P3 consultant defer + §8 P3+ revenue defer2026-08-2819:10 BSTv3.62.53Harrow School la_name data fix — Playwright cap /schools + /schools/138312 發現 Harrow School 顯示 "📍 Harrow, Cumberland" (明顯錯,Harrow 喺 London)。Trace 3 個 JSON: 138312.json metadata (LANAME Cumberland / LA 942) + index.json (la_name Cumberland) + la_aggregates_3year.json (las["312"].name "")。Cross-check boarding-schools.json 確認真 Harrow School = URN 102245 / DfE LA 312。Fix: 138312.json LANAME → "Harrow" / LA → "312", index.json la_name → "Harrow", la_aggregates_3year.json las["312"].name → "Harrow"。Playwright preview verify: Cumberland count 0 / Harrow count 34 ✓。淨 data fix, zero app code change。Lesson: DfE performance CSV 嘅 LA 942 ("Cumberland") 係 historic county pre-2023 reorg, 獨立學校 URN/LA mapping 同 GIAS edubase bulk 有時唔同源, cross-check boarding-schools.json (GIAS source of truth) 先 fix2026-08-2819:00 BSTv3.62.52Visual verify v3.62.49 admin features live (Playwright cap Telegram) — (1) Live Schools inline Suspend button: 7 buttons rendered (matches 7 active schools; Tonbridge 顯示 Reactivate), hover-reveal red ghost chip, 2-stage confirm via window.confirm(); (2) Message Monitor thread grouping: 2 threads grouped by student×school (Eton 3msg 4h ago + Harrow 1msg 2h ago, sort latest first), school_name enrichment via invite.school_name join 工作正常, header (Student badge ↔ school name + last-msg preview + count + relative time + chevron), click expand → chronological messages, ▸/▾ toggle。Zero code change, pure verify。Sent 3 screenshot (suspend-hover + messages-list + thread-expanded) 落 KC Telegram DM 確認 visual reality2026-08-2818:50 BSTv3.62.51/sitemap drift reconcile — student「Telegram 邀請通知」status partial → deferred (KC 2026-08-28 v3.62.50 explicit「Del all Telegram bot settings on the website」 — UI affordance 已 fully revert, bot infra 仍 running 但 no production trigger, spec §11 留待日後 re-scope)。Counter audit: 77 項 total (55 done / 10 partial / 9 missing / 3 deferred) 維持不變 — partial 變 deferred swap, Student row 由 10/3/1/0 → 10/2/1/1。Zero code change, pure bookkeeping2026-08-2818:35 BSTv3.62.50Revert Telegram bot UI affordance — student step-2 「Profile Complete!」card 嘅紫色 Telegram banner + t.me/Boardingmatch_bot deep link + 「Open Telegram bot ↗」按鈕全部刪走 (KC:「Del all Telegram bot settings on the website」)。student.vue template 18 行 / script 22 行 (TELEGRAM_BOT_HANDLE / telegramBotUrl / telegramConnected / onTelegramClick) / CSS 62 行 (.telegram-affordance + .telegram-affordance__icon/__body/__title/__sub/__btn + responsive shrink) 全部 revert。sitemap partial: 「Telegram 邀請通知 (UI affordance)」done 行刪,bot infra trigger 留 partial。School.vue / spec.md 嘅 Telegram mention 保留 (前者係 future-proofing adapter comment,後者係 product spec source-of-truth)。Active queue unchanged。2026-08-2719:52 BSTv3.62.47/sitemap drift — fix 5 個 stale counters + 加 region rollout band。Line 170 「67 項」→ 77 項 (52 done / 12 partial / 10 missing / 3 deferred, actual 12 個 new features v3.62.40-46 加咗)。Line 247 「17 個 London URN prerendered」→ 402 個 (24 London + 378 non-London)。Hero chip 「3 個 PRD roadmap item」→ 「3 個 active queue」+ h2 列出 §2 / §3 / §4 / §12 / §13 / §14 / §15 已 ship。新增 REGION SEO ROLLOUT band: 9 regions × school count (London 24 / SE 162 / SW 64 / EE 53 / WM 32 / Yorkshire 23 / EM 22 / NW 18 / NE 4)2026-08-2716:17 BSTv3.62.45Q9 — /schools/<URN> prerender extend 到 8 個非 London regions 全部 378 URNs (East Midlands 22 / East of England 53 / North East 4 / North West 18 / South East 162 / South West 64 / West Midlands 32 / Yorkshire 23)。之前 v3.62.40 只 prerender 24 個 London URN, /regions/[slug] school row link 對其他 378 個 URN 第一次 click 會 fallback。Playwright verify: 8 個 region 首個 URN 全 200 + 8 個 /regions/[slug] link 全 resolve2026-08-2714:47 BSTv3.62.43spec §14 Lead Visibility — criteria = prioritise, not filter (school.vue)。filterRegion/Gender/Age dropdowns 砍掉, 全部 active lead 對 paid school 預設可見, criteria_json 改做 sort priority + visual marker (📌 Matches your criteria navy pill 喺 hero card + 📌 Match mini pill 喺 peer row)。hasActiveCriteria gate 避免 empty criteria 嘅 false-positive 100% match (Scenario A empty / B HK 3 matched / C Antarctica 0 matched, all 20 leads visible)2026-08-2715:05 BSTv3.62.43.1hotfix: 砍 criteria_pre_filter → filterRegion watch, 因為 filterRegion ref 已 v3.62.43 移除, watch callback throw TDZ "Cannot access Je before initialization" 整個 school dashboard body blank2026-08-2715:17 BSTv3.62.43.2hotfix: hasActiveCriteria gate 加喺 browse-description template + hero chip + peer chip, 避開 default empty criteria_json 嘅 100% false-positive match2026-08-2714:23 BSTv3.62.42/sitemap drift reconcile — hero chip + deploy log sub-line + ship log 13 new rows prepended + PRD h2 "3 items (2026-08-15 review, §2 + §3 + §4 shipped)" + footer v3.62.41 · local 567bdbb + auth §15 done + admin sign-ups done + public SEO surfaces done + v3.62.32 row re-scoped to /school (Brymore 139255 冇 prerender route)2026-08-2713:11 BSTv3.62.41consultant auth gate (spec §15.2) — 公司 email 喺學生 sign-up 時被擋住, 只准個人 email (gmail / outlook / qq.com / 163.com / hotmail / icloud / proton 等 ~30 個 personal provider), 學校 institutional email 唔 block (學校本來就用公司 email)。Admin 喺新 Sign-ups tab 見到所有嘗試 (KPI total / allowed / blocked / company-email blocks) + 最近 50 個 attempt list + clear log button2026-08-2713:03 BSTv3.62.40-housekeepingtracker 補返 8-25 catch-up entry (NEXT.md + PROGRESS.md refresh) — 純 bookkeeping 唔涉及 code 改動2026-08-2521:25 BSTv3.62.40/schools/[URN] 加 basic GIAS profile fallback — 任何 URN 都可 render (matched.json + useBoardingSchools base data), 唔再 throw 404; /regions/[slug] 最右 CTA 改返內部 /schools/<URN> (之前連咗去外部學校網)。17 個 London URN 加咗入 prerender routes2026-08-2521:15 BSTv3.62.39/regions/[slug] 加 sidebar filter (性別 + 學段) + sort dropdown (alphabetical / size / recent) + list view mode2026-08-2519:40 BSTv3.62.38第一個 SEO/research surface — /regions/[slug] 喺 /regions/london/ 等 8 個地區, 列出嗰區所有 UK private boarding schools + DfE GIAS data2026-08-2415:54 BSTv3.62.37首頁簡化做一個 message「Schools come to you」+ 1 個 CTA (sign-in) — 暫時移走多餘 social-proof 區, 集中講 value prop2026-08-2400:07 BSTv3.62.36首頁加 search section — 學生可搜學校名 / 地區 (Option C: lazy-load /data/dfe/index.json, ~4 MB 第一次 fetch 後 cache)2026-08-2323:29 BSTv3.62.35TrendBarRow component — KS4 / KS5 / KS2 三個 trend 都共用 5-bar layout (Option B full align, 學校 bar vs national bar 上下對齊)2026-08-2322:55 BSTv3.62.34.3trend benchmark 改淨顯示最新一年 (2024/25) — 唔再 3-year average, 學生即時見到學校最新表現2026-08-2322:30 BSTv3.62.34.2Fix C v2 — 3-year trend 用 opacity-gradient bars 還原 (愈舊嘅年 opacity 愈低, 同時保留視覺對比)2026-08-2322:25 BSTv3.62.34.1Fix C — trend-table 改 visual bar comparison (之前嘅 +11.25 抽象數字改為肉眼即見學校 bar 長過 national bar; v3.62.34.2 還原 3-year trend)2026-08-2322:11 BSTv3.62.33demo 加 Wymondham College (URN 136481) — 唯一同時有 KS4 GCSE + KS5 A-Level 兩個 data 嘅 demo URN, 用嚟做 6-row trend table 嘅 full-data anchor2026-08-2322:02 BSTv3.62.32demo seed 加 Brymore Academy (URN 139255, boys boarding STEM Somerset) + Liverpool College (URN 139585, mixed Merseyside) — 兩個 demo school 喺 /school side 喺出嚟 invite students 用。UseDB.ts SCHOOLS_BY_URN 加呢 2 個 entry + dfe/index.json search 都收埋; dfe/{URN}.json + nuxt.config.ts prerender route 唔包呢兩個 URN (Brymore / Liverpool SEO profile 唔 render)2026-08-2317:28 BSTv3.62.28學校 public profile narrative render on /schools/[URN] (PRD §4 ship) — 新增 "About this school" section 喺 quick stats 之後, 4 個 block (welcome banner 藍底 / about paragraph / 3-col 1:1:1 grid = academic highlights · signature subjects · boarding life), per-field hide-if-empty rule 確保 non-demo URN 完全唔 render section, scoped chip-list / chip-pill shared styles (Vue scoped 唔會 inherit 跨 component — local copy intentional), Harrow URN 138312 加咗入 prerender routes2026-08-2316:32 BSTv3.62.27student profile enrichment English-only + tidy card layout (PRD §2 polish) — sweep 所有中文 label / option / placeholder / hint 改做英文, 重組做 4-row card grid (Interests full / Personality+English half / Direction full / Budget+Notes half), section header 加 subtitle + 8px 厚 progress bar with white track2026-08-2316:06 BSTv3.62.26學生 profile + 6 fields enrichment (PRD §2) — interests / personality / english_level (tier + IELTS/TOEFL) / direction / budget_band / 補充 (≤50字)。Wizard step 2 chip-pickers + progress bar「X / 6 filled」+ 3-field threshold 「學校會見到你完整 profile」。StudentUser 6 個 optional fields 加咗,Lead 唔 render(學校 side P3 scope)2026-08-2315:53 BSTv3.62.25sitemap P0 §3 reconciliation — Message 待跟進 tag verified live (v3.62.22 ship entry 漏咗),PRD roadmap §3 移除、school inbox thread chip + bulk button confirmed working(待跟進 / 已回覆 / 已跟進 3-state cycle)2026-08-2315:43 BSTv3.62.24sitemap drift reconcile — chip v3.62.18 → v3.62.24、ship log 補返 6 個 local-only commit(triage chip / Cantonese / PRD band / public profile / hide-if-empty / schools tidy 4-col)、1da2619 KS5 3-col 一齊 ship2026-08-1417:11 BSTv3.62.23.13 個 fit signals 加 hide-if-empty rule(冇 data 唔顯示)2026-08-1417:03 BSTv3.62.23學校公開 profile + 3 個新 fit signals(PRD §4)2026-08-1416:45 BSTv3.62.22學校 inbox 加 follow-up triage chip + bulk action2026-08-1416:28 BSTv3.62.21/sitemap 內容中文化2026-08-1416:21 BSTv3.62.20/sitemap 加 PRD roadmap 區,列 P0/P1/P2 features + blockers2026-08-2117:47 BSTv3.62.19schools/[URN] tidy 4-col text table (DESIGN_STANDARD 4-col) — 真正 deploy 嘅 v3.62.19

要畀真 user 用 — 5 個關卡

呢個就係點解而家未 ship。每個 unblock 唔同部分嘅 flow。B5 係 v4 模型新增嘅 — 唯一一個唔使寫 code 就解得到嘅 blocker。

PRD roadmap — 1 active queue item (§8 商業模式 2026-10-05 已由 spec §16 v4 解答)

§2-§15 嘅其他 sub-section 已 ship(見下方 6 個 page overview 嘅 done row)。§6 consultant 定位已反轉做 affiliate(§16.7),大幅降權。

SEO surface rollout — 9 regions × 411 boarding schools prerendered (v3.67.8 dataset refresh)

撳任何 region → /regions/[slug] 嗰區 list view。URN list 而家由 boarding-schools.json(411 間, generated 2026-10-09)動態生成,唔再 hardcode,學校名單一更新就唔會再 404, school profile 第一次 click 即時 render 唔再 fallback。

逐個 page 睇

Click 任何 card 睇邊啲做咗、邊啲 pending。

訪客喺門口見到咩。

7 done · 1 partial · 1 defer

Student / School / Admin 嘅 sign-in。

7 done · 4 partial · 1 missing
open /auth ↗

上傳成績 → profile → inbox (邀請 + 訊息)。

10 done · 3 partial
open /student ↗

🔴 2026-10-05 大改:唔再係「睇 leads → 主動邀請 → 管理 applying」。v4 之下學校免費上架、唔使搵 lead、唔使發邀請 — 平台代家長發 pitch 過嚟,學校只需回覆「想約面試」,之後只撳一粒掣報「收咗」。見上方 v4 band。

15 done · 1 missing
open /school ↗

審核、accounts、訊息監察、價格設定。

17 done · 1 partial
open /admin ↗

跨範疇:hosting、persistence、整合、合規。

3 done · 3 partial · 3 missing · 2 defer
v3.67.8 · 🔴 商業模式 v4(spec §16–§18,2026-10-05 重訂)· local + sitemap · 唔好擺去 public marketing page