2026-04-26 16:42 新功能
- Insights 頁新增 **Section 6:Basket Combo Matrix**,自動識別最常共購 SKU 組合
- 演算法:Approach B Lift Score(市場籃分析標準);指標:Lift / Confidence / Co-count
- 噪音過濾:MIN_SUPPORT=3 / MIN_LIFT=1.2;輸出 Top 50 pairs(lift 降序)
- 前端:cross-brand toggle + min support selector,Lift pill 顏色分級(≥5 紅 / ≥2 黃 / ≥1.5 綠)
- 自動建議:🔥 強 Bundle / ⭐ Mix & Match / 💡 觀察,附 top 3 actionable insight 文案
- 後端 `aggregate-insights.ts` 新增 `buildComboMatrix()`,`aggregate.ts` 輸出 `insights.basket_combo`
2026-04-26 16:28 優化
- **H-13 記憶體佔用優化**:`aggregate-insights.ts` 中 `CancelBucketAcc.byStoreEff` / `byStoreCancel` 從 `Set<string>` 改為 `number` 計數器
- 180k rows / 500 brands / 2 stores 場景估計釋放 ~10–20 MB heap(~1,000 Set objects freed)
- `buildBasketStats()` finalization 後加 `b.skus = new Set()` 釋放 GC 引用
- 新增 `aggregate-memory.test.ts`(18 tests)覆蓋 counter arithmetic / end-to-end cancel rate / 500-brand 壓測
- **H-14 Single-pass 確認**:`aggregate.ts` 係唯一 for-loop orchestrator,Ticket 直接 close(無需改動)
2026-04-26 16:17 優化
- **H-19 Sliding-window rate limit**:`track/view.ts` 新增 count-based 滑動窗口(1 min / 6 req per user)
- Throttle 時 response 含 `throttled_reason: "sliding_window_exceeded"` + CF tail log 可見
- Feature flag:`TRACK_VIEW_RATE_LIMIT_ENABLED != "0"` 才啟用,支援 rollback 無需 redeploy
- 新增 7 條滑動窗口測試覆蓋(6req pass / 7th throttled / 窗外恢復 / per-user 獨立)
2026-04-26 14:51 優化
- **B 線:Aggregate 拆模組完成**,`aggregate.ts` 從 1084 行縮減至 401 行(純 orchestrator)
- 新增 4 個子模組:`aggregate-kpi.ts`(144 行)/ `aggregate-insights.ts`(268 行)/ `aggregate-promo.ts`(307 行)/ `aggregate-output.ts`(212 行)
- 新增 `aggregate-snapshot.test.ts`(18 tests)鎖定 data.json 24 個 top-level key + schema contract
- 全套 100 tests / 5 files / 0 typecheck errors ✅
2026-04-26 14:41 優化
- C 線補充:新增 `upload-rebuild.smoke.test.ts`(18 tests)驗證 sanitizeFileName / UploadRecord schema / aggregate→data.json 24 key contract
- 新增 `auth-me.smoke.test.ts`(28 tests)驗證 Session HMAC round-trip / session refresh threshold / roleMeets 三層 hierarchy / parseCookies
2026-04-26 14:28 優化
- **C 線:測試 + CI 基線**:新增 `tsconfig.json`(strict mode)、`vitest.config.ts`、`package.json` test/typecheck/predeploy scripts
- 新增 `aggregate.test.ts`(23 tests)覆蓋 cancel taxonomy / KPI math / brand normalize / dailyCancelAcc / basket
- 新增 `track-view.smoke.test.ts`(13 tests)覆蓋 sanitize / ALLOWED_PATHS / rate-limit logic
- 新增 `.github/workflows/ci.yml`:Node 22 + typecheck + vitest run on push/PR
2026-04-26 14:14 優化
- **A 線:Activity Shard 模式**:`activity-store.ts` 全面重寫,採用 per-user-per-day shard schema(`activity/<YYYY-MM-DD>/<emailKey>.json`)
- CAS 只鎖單一 shard,消除跨用戶 hot-blob contention;legacy path 保留,rollback 只需 `ACTIVITY_SHARD_MODE=0`
- `track/view.ts` response 新增 `write_ok` / `mode` / `cas_conflict` 觀測欄位
- `auth.ts` Env interface 加 `ACTIVITY_SHARD_MODE?: string`,移除 `(env as any)` cast
- 新增 `activity-store.test.ts`(12 tests)覆蓋 emailKey / dateKey / shardKey / compaction / dedup
2026-04-26 14:22 修復
- Resend API Key 失效:更新 `RESEND_API_KEY` + 設定 `OTP_SENDER=HKTV Dashboard <noreply@nylimited.com>`
- `SESSION_SECRET` 空字串導致 HMAC key length=0 錯誤,已換用 64-char hex secret
- `SUPER_ADMIN` secret 重設(移除多餘空格),`sales@nylimited.com` 登入恢復正常
2026-04-26 16:19 優化
- 系統更新 Log 顯示重構:預設只顯示最近 3 條,其餘打包入「更多歷史記錄」摺疊按鈕
- `build_changelog.py` 更新:常數 `RECENT_COUNT=3`,自動分組 RECENT / HISTORY 兩段輸出
- Order Status Mix、Top 10 Brands、Top 10 Delivery Districts 三個 card 現已跟隨日期篩選(之前係全期 YTD 靜態數據)
- Backend 新增 `daily_status` / `brand_daily` / `district_daily` 三個 per-date breakdown(需 Rebuild data.json 生效)
- 三個 card 標頭新增 scope note:已 rebuild 顯示「跟隨日期篩選 · N 日」(綠色),未 rebuild 顯示「全期 YTD · 請 Rebuild」(橙色)
- Top 10 Brands GMV metric 用 `brand_daily` 精確計算;Qty metric 仍用全期 top_brands(per-date qty breakdown 留 Phase 2)
2026-04-24 16:42 新功能
- Insights 頁新增 3 個 section:AI 智能洞察(自動 derive top 3-5 insight)、Promo ROI Leaderboard(識別賺錢 vs 蝕本促銷)、Day-of-Week Performance(VIP Day uplift 量化)
- Promo ROI 完全跟時段 + 店舖篩選,含整體 ROI / 客單提升 / Top 15 promo 排名
- DOW 顯示每個 weekday 平均 GMV/單量/ATV,VIP Day 標記 + 最強/最弱日 insight
2026-04-24 14:25 新功能
- 全新 **💡 Insights 頁面**(`/insights.html`):獨立分析頁,營運效率 + 收入提升盲點
- **Cancel Rate Leaderboard**:SKU / Brand / District 三維度,最少 10 單觸發,揾出取消率異常高嘅 SKU 即時跟進
- **Order Timing Heatmap**:星期 × 小時 7×24 grid,識別 peak slot 排 promo launch、避開 dead hour
- **Basket Size Distribution**:單 SKU vs 多 SKU 訂單拆分,顯示 cross-sell gap + AOV 機會(單 vs 多嘅 AOV 差距)
- 後端 `aggregate.ts` 新增 `insights` 區塊,rebuild 後即可用
2026-04-24 14:15 新功能
- Admin 頁新增 **User Activity** 面板,睇到邊位用戶而家喺線、睇緊邊個頁面、揀咗邊個 time period
- 每行可點擊展開 drill-down,顯示最近幾次 filter 變動(preset、日期範圍、附加 extra)
- 24h / 7d / 30d 時段切換 · 每 60 秒自動刷新 online 狀態
- 前端每頁加 heartbeat(只喺 tab 可見 + 近 5 分鐘有活動時發送,減低 R2 write)
2026-04-24 12:29 新功能
- Top SKUs card 加 GMV / Qty 切換,可以改變排名基準(之前只支援 GMV)
- 切 Qty 模式時,表格按銷量由高至低排序,subtitle 顯示 "by Qty"
2026-04-24 12:03 優化
- Reset All Data 按鈕加強防呆:彈出 modal 解釋後果,必須輸入「RESET」先可以確認
- 舊嘅 `confirm()` 對話框換走,改用設計清晰嘅紅色警告 modal
2026-04-24 12:00 優化
- Admin 頁嘅角色權限說明改用中文顯示,方便本地團隊理解
- 明確標註 Editor 唔能 Reset 全部數據(呢個只有 Super Admin 有權)
2026-04-24 11:55 新功能
- Admin 頁新增 Role Reference 卡,清楚列出 Viewer / Editor / Super Admin 嘅能力範圍,方便指派角色
2026-04-24 10:56 優化
- 後台數據重建:Top SKUs 擴大至 100 條、品牌銷量數據齊全,WAGAYA 單店篩選唔會再空白
- 加入 `/api/rebuild` 內部觸發機制(需 REBUILD_KEY)畀 CI / 腳本喺部署後自動重建
2026-04-24 10:45 修復
- GMV Share 百分比 label 改用動態量度:slice 弧長唔夠容納字就自動用外部 callout(解決仲係貼邊嘅 case)
- Top Brands 加返 Qty 資料(backend 原本只計 GMV,今次補返銷量);切 Qty 時 x 軸顯示數量而唔係金額
- Promo / Subcategory Detail card:Store Split 欄擴闊 + 支援換行,兩間店金額永遠顯示齊
- Promo / Subcategory Detail card:Store Split 嘅 HK$ 簡化為 $(騰空間畀完整數字)
- Top SKUs 10/20/50/100 真正生效(backend 之前只返 10 條,今次提升到 100)
2026-04-24 10:41 修復
- Daily GMV / Daily Orders 圖表唔再會喺 > 30 日時自動變週度 bar(避免同 Weekly GMV card 重複)
- Daily 圖表永遠維持 daily line,保留每日 rhythm 資訊;要睇週度匯總請用下方 Weekly GMV card
2026-04-24 10:30 優化
- 更新日誌改用半自動模式,由 CHANGELOG.md 統一管理,deploy 時自動同步
- 日誌支援顯示日期 + 具體時間
2026-04-24 10:26 新功能
- 頁腳新增可摺疊嘅系統更新日誌,用戶可隨時查閱改動歷史
2026-04-24 10:06 新功能
- 日期跨度超過 30 日嘅圖表,自動切換做週度匯總,更易睇出趨勢
- 所有趨勢圖加 ⛶ 放大按鈕,全螢幕細看都得
- Top Brands 加 **GMV / 銷量** 切換
- Top SKUs 加 **10 / 20 / 50 / 100** 數量篩選,表格可 scroll
- Promo 同 Sub-category 圖表改成並排 grouped bar,更緊湊
2026-04-24 02:05 修復
- 批量 upload 自動跳過冇訂單嘅空 xlsx 檔,唔再當 error
2026-04-24 02:02 新功能
- 預設時段由 All time 改成 **本月至今**(新增 MTD 快捷按鈕)
2026-04-24 00:20 修復
- GMV Share 百分比 label 位置調整,唔再貼近環邊緣
- 細 slice(< 6%)改用外部 callout,避免重疊
- Daily GMV Trend legend 顏色修正(唔再兩個都啡色)
- Daily Orders & ATV 加返 legend,Orders / VIP / ATV 三個 dataset 清晰分開
2026-04-24 00:04 修復
- 同一日重複 upload 時新檔覆蓋舊檔,唔會重複 count
2026-04-24 01:40 新功能
- 新增 **促銷表現** 模組:Top 促銷、加購附加率、平均折扣率
- 新增 **子類別** 分析,支援逐日 drilldown
2026-04-24 09:57 新功能
- 新增 **🔄 Compare periods** 頁面(MoM / 自訂區間 / Movers & Shakers)
2026-04-23 優化
- 上傳架構重構成 sharded,支援約 2 年數據而唔會 rebuild timeout
- 新增上傳歷史,Admin 頁可查看同刪除過往上傳